前段时间用sdl嵌入SOUI做视频播放器,由于SOUI习惯屏蔽系统默认的非客户区,而在窗口自己的客户区分出一块来模拟非客户区,导致窗口在拉伸的时候,SOUI窗口会出现比较严重的闪烁(不光是SOUI这样,其它UI库也存在类似问题,应该是MS的原因),打开系统的非客户区就不闪烁。

为了让业务层有更一致的UI体验,SOUI4基于SOUI的控件框架搭建了一套非客户区绘制框架,使得可以像客户区一样操作非客户区,方便需要嵌入视频的应用更好的统一界面效果。

使用方法:

首先这类窗口不支持窗口的逐点半透明效果,因此必须关闭soui元素里的translucent属性。

然后在soui元素下加入ncpainter元素如下:

 1 <ncpainter system="false" borderWidth="5dp" titleHeight="30dp" skinBorder="_skin.sys.wnd.bkgnd"
2 skinActive="skin_active" skinInactive="skin_inactive"
3 colorActiveTitle="@color/white"
4 colorInactiveTitle="@color/white"
5 layout="hbox" gravity="center" >
6 <icon id="sysid_icon" src="ICON_LOGO:16"/>
7 <text id="sysid_title">@string/title</text>
8 <window size="0,0" weight="1"/>
9 <imgbtn id="sysid_min" skin="_skin.sys.btn.minimize" animate="1" />
10 <window>
11 <imgbtn id="sysid_max" skin="_skin.sys.btn.maximize" pos="0,0" animate="1" />
12 <imgbtn id="sysid_restore" skin="_skin.sys.btn.restore" pos="0,0" show="0" animate="1" />
13 </window>
14 <imgbtn id="sysid_close" skin="_skin.sys.btn.close" tip="close" animate="1"/>
15 </ncpainter>

其中system, borderWidth,titleHeight,skinBorder, skinActive, skinInactive, colorActiveTitle, colorInactiveTitle是ncpainter专有属性。

system是bool类型,默认为false,代表使用SOUI的自绘非客户区,为true则代表使用系统默认的非客户区。

borderWidth代表边框宽度,titleHeight代表窗口头高度。

skinBorder是一个绘制边框的skin对象。

skinActive, skinInactive是两个绘制标题栏背景的skin对象,分别对应激活状态和失活状态。

colorActiveTitle, colorInactiveTitle是两个绘制标题栏文本的颜色,分别对应激活状态和失活状态。

其它属性和SWindow一样,子窗口的布局属性也和其它常规窗口一样。

和常规窗口一个不同点在于,非客户区由于不处理键盘事件,因此不要在非客户中布局edit等需要处理键盘的控件。

非客户区控件增加了几个系统ID,以sysid_XXX命名,这几个ID会同步系统的默认行为。

1     enum{
2 IDC_SYS_ICON=100,
3 IDC_SYS_TITLE=101,
4 IDC_SYS_CLOSE=102,
5 IDC_SYS_MIN=103,
6 IDC_SYS_MAX = 104,
7 IDC_SYS_RESTORE = 105,
8 };
 1 int SNcPainter::toNcBuiltinID(const SStringW & strValue)
2 {
3 static struct SystemID
4 {
5 int id;
6 LPCWSTR pszName;
7 } systemID[] = { IDC_SYS_ICON, L"sysid_icon", IDC_SYS_TITLE, L"sysid_title", IDC_SYS_CLOSE, L"sysid_close",
8 IDC_SYS_MIN, L"sysid_min", IDC_SYS_MAX, L"sysid_max", IDC_SYS_RESTORE, L"sysid_restore"};
9 if (!strValue.IsEmpty())
10 {
11 if (strValue.Left(5).CompareNoCase(L"sysid") == 0)
12 {
13 for (int i = 0; i < ARRAYSIZE(systemID); i++)
14 {
15 if (strValue.CompareNoCase(systemID[i].pszName) == 0)
16 {
17 return systemID[i].id;
18 }
19 }
20 }
21 }
22 return 0;
23 }

除了上述差异,非客户区控件和客户区其它控件没有区别。

上图标题栏就是采用新的非客户区绘制框架做出来的,即保持了和客户区界面效果一致,也解决了拉伸闪烁问题。

在SOUI4中使用非客户区自绘的更多相关文章

  1. C# 绘制窗体客户非客户区要用WM_PAINT和WM_NCPAINT

    窗体分为两部分:客户区(Client area)和非客户区(Non-Client area) WM_PAINT消息.OnPaint()方法.GetDC()API函数都是处理窗体客户区绘制的   而标题 ...

  2. 调用API函数,在窗口非客户区绘图(通过GetWindowDC获得整个窗口的DC,就可以随意作画了)

    http://hi.baidu.com/3582077/item/77d3c1ff60f9fa5ec9f33754 调用API函数,在窗口非客户区绘图 GDI+的Graphics类里有个FromHdc ...

  3. VC----SDK下对窗口非客户区的操作

    窗口分成两大部分:客户区和非客户区.非客户区再次细分:标题栏,如图片中顶部深蓝色:左边框,如图片中红色部分:上边框,如图片中绿色部分:右边框,如图片中右侧天蓝色部分:底边框,如图片中下面棕色部分. 之 ...

  4. 一文看懂js中元素的客户区大小(clientWidth,clientHeight)

    元素的客户区 元素的客户区大小,指的是元素内容及其内边距所占据的空间大小. 相关属性如下: 1. clientWidth:元素内容区宽度+元素左右内边距 2. clientHeight:元素内容区高度 ...

  5. 2019-11-29-WPF-非客户区的触摸和鼠标点击响应

    原文:2019-11-29-WPF-非客户区的触摸和鼠标点击响应 title author date CreateTime categories WPF 非客户区的触摸和鼠标点击响应 lindexi ...

  6. 2019-8-8-WPF-非客户区的触摸和鼠标点击响应

    title author date CreateTime categories WPF 非客户区的触摸和鼠标点击响应 lindexi 2019-08-08 16:48:31 +0800 2019-07 ...

  7. Winfrom中From控件的重绘

    重绘目的: 1. 满足非默认主题下的标题栏样式 2. 在保留停靠功能的同时进行重绘. 代码如下: public partial class FormEx: Form { public FormEx() ...

  8. 老话题:自己编写只截窗口客户区的截屏软件(VB2010)

    现在能实现截屏的软件很多,就不一一列举了,连WIN7都自带截屏软件,甚至OFFICE2010开始都有截屏的功能. 截屏软件虽多,无外乎三种截屏方式:全屏截图.窗口截图.自定义矩形截图. 其中,窗口截图 ...

  9. 元素大小-偏移量(offset)客户区大小(client)滚动大小(scroll)

    一.偏移量---offset 1.定位父级 在理解偏移大小之前,首先要理解offsetParent.人们并没有把offsetParent翻译为偏移父级,而是翻译成定位父级,很大原因是offsetPar ...

  10. 深入理解客户区尺寸client

    前面的话 关于元素尺寸,一般地,有偏移大小offset.客户区大小client和滚动大小scroll.前文已经介绍过偏移属性,后文将介绍scroll滚动大小,本文主要介绍客户区大小client 客户区 ...

随机推荐

  1. .NET云原生应用实践(六):多租户初步

    本章目标 多租户简介 实现public租户下的用户数据隔离 出于开发进度考虑,本章暂不会完全实现多租户的整套体系,而是会实现其中的一小部分:基于默认public租户的数据隔离,并在本章节中会讨论多租户 ...

  2. 2025年前端面试准备vue篇

      1.VUE的声明周期有哪些及每个生命周期做了什么 beforeCreate: 是new Vue() 之后触发的第一个钩子,data,methods,computed 以及watch 上的数据和方法 ...

  3. TOML 1.0格式语法

    github: https://github.com/BurntSushi/toml TOML 旨在成为一个语义显著而易于阅读的最低限度的配置文件格式.TOML 被设计地能够无歧义地转化为哈希表.TO ...

  4. Linux终端命令之screen

    screen的功能 screen的功能大体有三个: 会话恢复:只要Screen本身没有终止,在其内部运行的会话都可以恢复.这一点对于远程登录的用户特别有用--即使网络连接中断,用户也不会失去对已经打开 ...

  5. Redis集群搭建-Docker

    使用docker搭建本地集群Redis服务(参考:https://www.cnblogs.com/slowbirdoflsh/p/11633113.html) 环境配置 # 拉取redis镜像 doc ...

  6. ZCMU-1133

    emm就直接看的前辈的了. 唉 #include <stdio.h> #include <string.h> #include <algorithm> //我不成熟 ...

  7. Qt 窗口随控件变换大小

    QVBoxLayout* verticalLayout = new QVBoxLayout(this); verticalLayout->setSizeConstraint(QLayout::S ...

  8. RabbitMQ快速入门 整合 SpringBoot

    RabbitMQ快速入门 整合 SpringBoot 概述 大多应用中,可通过消息服务中间件来提升系统异步通信.扩展解耦能力.流量削峰 消息服务中两个重要概念: 消息代理(`message broke ...

  9. 【Amadeus原创】HP惠普笔记本重装系统无法引导无法进操作系统的终极解决方法

    F9进入BIOS-先进(Advanced)-安全引导配置- 启用传统支持和禁用安全引导

  10. R数据分析:临床研究样本量计算、结果解读与实操

    很久之前给大家写过一篇文章详细介绍了样本量计算的底层逻辑,不过那篇文章原理是依照卡方比较来写的,可以拓展到均值比较,但视角还是比较小,今天从整个临床研究的角度结合具体的例子谈谈大家遇到的样本量的计算方 ...