在SOUI4中使用非客户区自绘
前段时间用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中使用非客户区自绘的更多相关文章
- C# 绘制窗体客户非客户区要用WM_PAINT和WM_NCPAINT
窗体分为两部分:客户区(Client area)和非客户区(Non-Client area) WM_PAINT消息.OnPaint()方法.GetDC()API函数都是处理窗体客户区绘制的 而标题 ...
- 调用API函数,在窗口非客户区绘图(通过GetWindowDC获得整个窗口的DC,就可以随意作画了)
http://hi.baidu.com/3582077/item/77d3c1ff60f9fa5ec9f33754 调用API函数,在窗口非客户区绘图 GDI+的Graphics类里有个FromHdc ...
- VC----SDK下对窗口非客户区的操作
窗口分成两大部分:客户区和非客户区.非客户区再次细分:标题栏,如图片中顶部深蓝色:左边框,如图片中红色部分:上边框,如图片中绿色部分:右边框,如图片中右侧天蓝色部分:底边框,如图片中下面棕色部分. 之 ...
- 一文看懂js中元素的客户区大小(clientWidth,clientHeight)
元素的客户区 元素的客户区大小,指的是元素内容及其内边距所占据的空间大小. 相关属性如下: 1. clientWidth:元素内容区宽度+元素左右内边距 2. clientHeight:元素内容区高度 ...
- 2019-11-29-WPF-非客户区的触摸和鼠标点击响应
原文:2019-11-29-WPF-非客户区的触摸和鼠标点击响应 title author date CreateTime categories WPF 非客户区的触摸和鼠标点击响应 lindexi ...
- 2019-8-8-WPF-非客户区的触摸和鼠标点击响应
title author date CreateTime categories WPF 非客户区的触摸和鼠标点击响应 lindexi 2019-08-08 16:48:31 +0800 2019-07 ...
- Winfrom中From控件的重绘
重绘目的: 1. 满足非默认主题下的标题栏样式 2. 在保留停靠功能的同时进行重绘. 代码如下: public partial class FormEx: Form { public FormEx() ...
- 老话题:自己编写只截窗口客户区的截屏软件(VB2010)
现在能实现截屏的软件很多,就不一一列举了,连WIN7都自带截屏软件,甚至OFFICE2010开始都有截屏的功能. 截屏软件虽多,无外乎三种截屏方式:全屏截图.窗口截图.自定义矩形截图. 其中,窗口截图 ...
- 元素大小-偏移量(offset)客户区大小(client)滚动大小(scroll)
一.偏移量---offset 1.定位父级 在理解偏移大小之前,首先要理解offsetParent.人们并没有把offsetParent翻译为偏移父级,而是翻译成定位父级,很大原因是offsetPar ...
- 深入理解客户区尺寸client
前面的话 关于元素尺寸,一般地,有偏移大小offset.客户区大小client和滚动大小scroll.前文已经介绍过偏移属性,后文将介绍scroll滚动大小,本文主要介绍客户区大小client 客户区 ...
随机推荐
- Java网络爬虫的实现
记得在刚找工作时,隔壁的一位同学在面试时豪言壮语曾实现过网络爬虫,当时的景仰之情犹如滔滔江水连绵不绝.后来,在做图片搜索时,需要大量的测试图片,因此萌生了从Amazon中爬取图书封面图片的想法,从网上 ...
- Linux防火墙工具之firewall
CentOS7 的防火墙配置跟以前版本有很大区别,CentOS7这个版本的防火墙默认使用的是firewall,与之前的版本Centos 6.x使用iptables不一样 一.iptables防火墙1. ...
- Graylog之基本使用
文档:https://docs.graylog.org/en/3.0/ Graylog Sidecar是一个轻量级配置管理系统,适用于不同的日志收集器,也称为后端.Graylog节点充当包含日志收集器 ...
- Springboot集成WebSocket实现智能聊天【Demo】
背景 openai 目前越来越流行,其他 ai 产业也随之而来,偶然翻到 openai接口文档,就想着可以调用接口实现智能聊天,接下来就写写我怎么接入 websocket 的过程,文笔不佳,谅解. 接 ...
- juc 学习
CyclicBarrier 应用场景是比如在做压力测试时,使用多少个用户并发,做集合点测试. 比如设置 100个用户并发,100个用户同时进行压测,只有100个用户压测完毕时,才能再发起下一波的压力测 ...
- Coqui TTS合成语音
工具介绍 Coqui TTS是一个用于语音转文本的高性能深度学习模型库.提供1100种语言的预训练模型,提供训练新模型和微调已有模型的工具,提供数据集分析工具.XTTS-v2版本支持16种语言: En ...
- Vue组件样式穿透
前情 Vue是目前主流的前端框架之一,我是Vue框架的忠实老用户,平时开发中如果再依赖个第三方组件库那样开发效率就会事半功倍. 第三方组件库可以很大提高开发效率,但是叫会有一些UI效果需要自定义,如想 ...
- ArkTs布局入门02——弹性布局(Flex)
1.概述 弹性布局(Flex)提供更加有效的方式对容器中的子元素进行排列.对齐和分配剩余空间.容器默认存在主轴与交叉轴,子元素默认沿主轴排列,子元素在主轴方向的尺寸称为主轴尺寸,在交叉轴方向的尺寸称为 ...
- idea配置gradle国内镜像源
项目文件中找到build.gradle文件,修改其中的buildscript和allprojects地址: buildscript { repositories { maven{ url 'http: ...
- PDF 的一些资料
PDF Succinctly https://www.syncfusion.com/ebooks/pdf Create PDFs in ASP.NET - getting started with i ...