在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 客户区 ...
随机推荐
- redis6.0安装与使用
[Linux] 源码安装: 下载安装 Cd /usr/local/src/ wget https://download.redis.io/releases/redis-6.0.9.tar.gz $ t ...
- 【架构】整理了一份通用的MVP框架示例代码
最近回顾了一下MVP框架,结合阅读到的几篇不错的博客,自己整理了一份可用于实际工作的MVP框架示例代码,这里做个记录,也顺便和网友们分享一下. 代码示例演示的是一个输入员工号查询员工信息并显示的场景, ...
- Fleck:一个轻量级的C#开源WebSocket服务端库
推荐一个简单易用.轻量级的C#开源WebSocket服务端库,方便我们快速实现WebSocket的开发. 01 项目简介 Fleck 是一个用 C# 编写的轻量级 WebSocket 服务器库.它提供 ...
- Python中构建全局字典的详细指南
在Python编程中,全局变量是指在整个程序运行期间都可以访问的变量.全局字典作为一种特殊的全局变量,可以存储各种类型的数据,包括字符串.数字.列表.元组等,这使得它在数据管理和跨模块通信方面非常有用 ...
- 在centos上部署docker与wordpress
简介 有一个wordpress服务器需要迁移了,之前都是别人维护的,现在需要迁移到自己维护,给的系统是linux centos 8.4.迁移包括mysql,php,phpmyadmin,wordpre ...
- Web前端常见的英文缩写
PV (Page View)页面浏览量 FED(Front-End Development)前端开发 F2E(Front-End Engineer)前端工程师 WWW(World Wide Web)万 ...
- Mac安装CMake
官网下载CMake: 传送门:https://cmake.org/download/ image.png 安装完打开: image.png 选择Tools-->How to instal ...
- 关于Jetson nano (B02)如何部署Yolov8以及一些必要的知识点
一.前言 记录一个简单的安装和部署过程,尽管笔者也是按照教程来的,但奈何参考了很多教程,虽然写的都非常好,但是却很散,因此笔者这里想把这些教程的精华提炼出来,汇总并且写在正文处.还是老规矩,笔者也在学 ...
- Qt/C++编写监控实时显示和取流回放工具(回放支持切换进度)
一.前言 现在各个监控大厂做的设备,基本上都会支持通过rtsp直接取流显示,而且做的比较好的还支持通过rtsp回放取流,基本上都会约定一个字符串的规则,每个厂家都是不一样的规则,比如回放对应的rtsp ...
- Qt编写安防视频监控系统52-颜色配置
一.前言 在系统打印日志或者窗口信息栏中,各种临时打印信息都显示在这里,很多时候我们还需要对特定的类别的信息突出颜色显示,比如告警信息,甚至对不同的告警级别的信息还可以分别不同的颜色显示,这样看起来会 ...