前段时间用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. 如何使用建造者模式(Builder Pattern)创建不可变类

    本文由 ImportNew - 唐小娟 翻译自 Journaldev.如需转载本文,请先参见文章末尾处的转载要求. ImportNew注:如果你也对Java技术翻译分享感兴趣,欢迎加入我们的 Java ...

  2. Java之基础语法

    最近发现公司中老的项目有些是基于Java开发的, 为了更好的后期维护 不得而要好好了解一下java, 之前一直比较抵触这门语言,现在随着了解的语言(PHP,Python,golang,shell,no ...

  3. mysql之编译安装

    在CentOS7中编译安装MySQL 5.7.29 一.依赖包安装 yum install gcc gcc-c++ ncurses ncurses-devel cmake bison -y 二.下载源 ...

  4. 如何使用docsify搭建自己的github文档?

    安装前提 确认电脑已经安装好 node 和 npm 环境. 如果还没有装好,那需要执行下面的步骤: 1.进入官网:https://nodejs.org/zh-cn/ , 下载长期支持版. 2.安装就直 ...

  5. 论文解读《Neural Cleanse: Identifying and Mitigating Backdoor Attacks in Neural Networks》

    发表时间:2019 期刊会议:IEEE Symposium on Security and Privacy (S&P) 论文单位:UC Santa Barbara 论文作者:Bolun Wan ...

  6. VMpwn总结

    前言: 好久没有更新博客了,关于vm的学习也是断断续续的,只见识了几道题目,但是还是想总结一下,所谓vmpwn就是把出栈,进栈,寄存器,bss段等单独申请一块空闲实现相关的功能,也就是说一些汇编命令通 ...

  7. ChatGPT生成测试用例的最佳实践(二)

    这种测试用例还不够直观,能不能让其以表格的形式显示呢?笔者输入"请以表格形式展示,谢谢."提示词,ChatGPT输出的部分内容如图3-3所示. 图3-3  ChatGPT输出的部分 ...

  8. Docker Logs清理

    查看docker日志路径 docker inspect --format='{{.LogPath}}' <container_name_or_id> 清理docker日志 echo |su ...

  9. npm install报错的解决方法

    解决方法 node版本不对,问问前端开发,node版本是什么版本,用nvm install,并切换到正常的node版本: git代码有时候会有冲突,把前端项目中的依赖包node_modules 和 p ...

  10. .NET周刊【12月第2期 2024-12-08】

    国内文章 终于解决了.net在线客服系统总是被360误报的问题(对软件进行数字签名) https://www.cnblogs.com/sheng_chao/p/18581139 升讯威在线客服与营销系 ...