DuiLib的消息传递机制

news2024/11/26 2:28:19

前言

学会了怎么写XML文件,但是我还是不知道怎么实现各个控件之间的消息传递。于是我对源代码好好研究了一下,发现duilib作为一个界面库有自己独立的封装的窗口类,也就是WindowsImplBase

在这个类中,实现对windows窗口传过来的消息的处理,以及初始化时创建控件,绘制窗口等功能。继承这个窗口类,就可以将我们自己的XML文件解析,显示自己设计的窗口。

//.h头文件
virtual CControlUI* CreateControl(LPCTSTR pstrClass); //创建XML文件中的控件,如果自绘控件的话,需要重载这个函数,否则无法加载XML文件中的自绘控件
virtual CDuiString GetSkinFolder();  //设置XML文件的路径
virtual CDuiString GetSkinFile() = 0;//获取XML文件的名字

窗口类解析完XML文件后,窗口就可以显示了,我们还要重载INotifyUI类中的消息处理函数来处理自己窗口获得的消息。

void Notify(TNotifyUI& msg)//消息处理函数;

在这个函数里面,msg是一个结构体,新手同学可以去看看定义。msg.pSender这个指针就是获得消息的控件指针,调用GetType()这个函数获取消息的类型,是单击还是右键等等,然后调用GetName这个函数去对应控件,做相应的处理。
在这里插入图片描述

typedef struct tagTNotifyUI 
{
	CDuiString sType;
	CDuiString sVirtualWnd;
	CControlUI* pSender;
	DWORD dwTimestamp;
	POINT ptMouse;
	WPARAM wParam;
	LPARAM lParam;
} TNotifyUI;

在这里就有一个相当有用的点,假如单击这个控件,要对另一个控件进行操作该怎么办呢?
在这里我也疑惑了很久,可能是因为菜鸟。后面看别人的代码自己总结出来一种方法,不知道有没有更好的。

每一个控件都有一个管理控件的对象(m_PaintManager),通过这个对象管理对应的控件,我们还可以查找窗口里的任意控件。里面提供了很多种查找方法,常用的如下。

在这里插入图片描述

 CControlUI* FindSubControlByPoint(CControlUI* pParent, POINT pt) const;  
 CControlUI* FindSubControlByName(CControlUI* pParent, LPCTSTR pstrName) const;  
 CControlUI* FindSubControlByClass(CControlUI* pParent, LPCTSTR pstrClass, int iIndex = 0);  

用这三个函数基本上可以满足我们的所有需求。有通过坐标查找的,有用名字的,还有用控件属性的。函数里的第一个参数是要查找的控件的父控件,也可以是更上层的父控件。在用第三个函数的时候需要注意,它的遍历子控件的方式是深度优先遍历,如果需要用到iIndex(指第几个同类控件),要考虑到前面包含的所有同类控件,并且标号是从0开始的。

这样我们就可以通过msg.pSender->GetParent() 来获得父类(可以反复调用),GetManager() 来使用查找方法,然后用查找子控件的方式获得要处理的控件的指针,OK了。

还有一点就是返回的指针都是CControlUI类型的,有很多设置参数的函数都无法使用。因为duilib所有控件都是以CControlUI为父类的,所以可以使用强制转换转成它原来的控件类型,就很方便对它操作了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/753787.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【每日一题】2673. 使二叉树所有路径值相等的最小代价

【每日一题】2673. 使二叉树所有路径值相等的最小代价 2673. 使二叉树所有路径值相等的最小代价题目描述解题思路 2673. 使二叉树所有路径值相等的最小代价 题目描述 给你一个整数 n 表示一棵 满二叉树 里面节点的数目,节点编号从 1 到 n 。根节点编号为 1 &#…

前端day06笔记

数组遍历 for let i in 数组名 函数 没有return返回的是underfined var是全局作用域 匿名函数 具名函数 值传递 引用传递 arguments:接实参 箭头函数 递归 闭包 对象的增删改查 对象的遍历 数组对象 获取数组对象 内置对象 从2-10

保险企业如何做好数据安全合规与敏感数据保护

监管部门多次“重拳出击”,保险企业如何做好敏感数据保护工作? 继《个人信息保护法》、《中华人民共和国消费者权益保护法》、《中国银保监会办公厅关于印发银行保险机构信息科技外包风险监管办法的通知》、《互联网保险业务监管办法》等相关法规之后&am…

CNN从搭建到部署实战(pytorch+libtorch)

模型搭建 下面的代码搭建了CNN的开山之作LeNet的网络结构。 import torchclass LeNet(torch.nn.Module):def __init__(self):super(LeNet, self).__init__()self.conv torch.nn.Sequential(torch.nn.Conv2d(1, 6, 5), # in_channels, out_channels, kernel_sizetorch.nn.Sig…

mysql 第三章

目录 1.索引 2.事务 3.总结 1.索引 2.事务 3.总结 事务是一种机制,一个操作序列。包含了一组数据库操作命令。

静态数码管——FPGA

文章目录 前言一、数码管1、数码管简介2、共阴极数码管or共阳极数码管3、共阴极与共阳极的真值表 二、系统设计1、模块框图2、RTL视图 三、源码1、seg_led_static模块2、time_count模块3、top_seg_led_static(顶层文件) 四、效果五、总结六、参考资料 前言 环境: 1、…

大学生用一周时间给麦当劳做了个App(微信小程序版)

背景 有个大学生粉丝最近私信联系我,说基于我之前开源的多语言项目做了个仿麦当劳的项目,虽然只是个样子货,但是收获颇多,希望把自己写的代码开源出来供大家一起学习进度。这个小伙伴确实是非常积极上进,很多大学生&a…

MySQL数据库(三)

前言 聚合查询、分组查询、联合查询是数据库知识中最重要的一部分,是将表的行与行之间进行运算。 目录 前言 一、聚合查询 (一)聚合函数 1、count 2、sum 3、avg 4、max 5、min 二、分组查询 (一)group by …

Docker架构

目录 Docker总架构图Docker ClientDocker DaemonDocker ServerDocker EngineJob Docker RegistryGraphDriverGraphDriverNetworkDriverExecDriver LibcontainerDocker Container Docker可以帮助用户在容器内部快速自动化部署应用,并利用Linux内核特性命名空间&#…

微软将推出更多Edge特有功能,与Chrome展开竞争

微软在 2018 年宣布将推出基于 Chromium 构建的 Edge 浏览器,并于 2020 年 1 月推出了新版 Edge。如今时隔三年,根据统计 Edge 全平台的市场占有率仅为 4.23%,如果只考虑桌面端的话,Edge 的市场占有率则是 10.98%,这两…

系统设计蓝图 / 备忘单

开发一个强大、可扩展和高效的系统可能会令人望而却步。然而,了解关键概念和组件可以使这个过程更可管理。在本博客文章中,我们将探讨系统设计的关键概念和组件,如DNS、负载均衡、API网关等,以及一个简明的备忘单,可以…

inux运维面试题(二)之系统管理类面试题

Linux运维面试题(二)之系统管理类面试题 1.权限优化1.1 简述Linux权限划分原则文件基本权限默认权限特殊权限sudo授权文件系统属性权限 解答 2.备份策略2.1需要备份的内容备份策略备份频率备份存储位置 2.2网站服务器每天产生的日志数量较大,…

LLM - 读取 Lora 模型进行文本生成

目录 一.引言 二.Lora 模型文本生成 1.模型读取 1.1 AutoModelForCausalLM.from_pretrained 1.2 PeftModel.from_pretrained 2.文本生成 2.1 Tokenizer 2.2 model.generate 3.输出实践 三.总结 一.引言 前面介绍了使用 Baichuan7B 从样本生成到 Lora 模型微调和存储…

磁盘擦写次数计算

1.让机器能有外网 2,安装工具 sudo apt-get install smartmontools 3,输入查询命令 sudo smartctl -x /dev/sda |egrep Device Model|User Capacity|Sector Size|173|Logical Sectors Written|Percentage Used Endurance Indicator 4,计算擦写次数 计算方法:25…

hadoop启动无法启动datanode或者namenode

首先进入hadoop安装目录下例如: 再进入dfs目录下,没有出现在hdfs-site.xml配置的data或者name cd data/current vim VERSION 打开VERSION文件复制:clusterID下的内容 将内容复制到name中的VERSION。再进行重启Hadoop

常见的前端安全以及常规安全策略

1、CSRF:跨站请求伪造(Cross-site request forgery); 原理: (1) 用户C打开浏览器,访问受信任网站A,输入用户名和密码请求登录网站A; (2&#xff…

mapping文件目录生成修改

参考文章: gradle编译完成Copy mapping文件 - 简书 (jianshu.com) 第一步:在app的build.gradle中做如下配置: android {android.applicationVariants.all {variant ->def buildType variant.buildType.nametasks.all {def mappingDir …

米尔基于STM32MP135核心板,助力充电桩发展

随着电动车的普及和人们环保意识的增强,充电桩作为电动车充电设备的重要一环,充电桩行业正迅速发展,消费市场的大量应用也造就市场的需求量不断增长。因此,产品的功能、可靠性、安全性等要求也变得尤为重要,而采用传统…

Leetcode---353周赛

周赛题目 2769. 找出最大的可达成数字 2770. 达到末尾下标所需的最大跳跃次数 2771. 构造最长非递减子数组 2772. 使数组中的所有元素都等于零 一、找出最大的可达成数字 这题就是简单的不能在简单的简单题, 题目意思是:给你一个数num和操作数t&…

智能分析网关V2有抓拍告警但无法推送到EasyCVR,是什么原因?

我们在此前的文章中也介绍了关于智能分析网关V2接入EasyCVR平台的操作步骤,感兴趣的用户可以查看这篇文章:在EasyCVR新版本v3.3中,如何正确接入智能分析网关V2? 智能分析网关V2是基于边缘AI计算技术,可对前端摄像头采…