5、DuiLib组件结构的初探

news2024/12/21 21:41:08

文章目录

  • 1、DuiLib组件结构的初探

1、DuiLib组件结构的初探

DuiLib 整体的实现不仅仅有控件,还有窗口消息、XML处理等模块,官方曾经过出的一个结构图如下:

在这里插入图片描述

图中还是比较详细的描述了 DuiLib 的整体设计,值得注意的部分是 “窗口管理器” 部分(main 函数中的 CPaintManagerUI),它不单承担了一系列窗口资源的管理、窗口的消息的处理,还承担了解析后的 XML窗口之间的一个桥梁作用,我们可以通过窗口管理器查找指定名称的控件并把它保存下来转换为指定控件对象,然后调用其对象的相应方法来控制控件的状态。

为了让接下来的代码演示更加容易学习查看,我们还是把写在了一个 cpp 文件的 MainWndFrame 类放到单独的文件中。如下图所示:
在这里插入图片描述

接下来,我们实现一个基类 WindowImplBase 提供的 InitWindow 方法,该方法在窗口创建(OnCreate)时被调用,如下所示:

在这里插入图片描述
我们可以在这个方法中查找 XML 中我们需要的控件,并把它转换成真正的控件对象,首先我们要给我么需要控制的控件名个名字。通过给控件的 XML 配置增加 name 属性来指定控件的名称。
在这里插入图片描述
然后在 MainWndFrame 类中添加几个私有成员变量来准备 “接收” 这几个控件,请注意这里给控件赋初值是使用 C++11 的新特性,老版本的编译器是不支持的,你可以放到构造函数来初始化。
在这里插入图片描述
随后在刚才我们覆写的 InitWindow 函数中使用之前我们提到的 窗口管理器 来查找控件,方法如下:

void MainWndFrame::InitWindow(){
	btn_min_ = dynamic_cast<CButtonUI*>(m_PaintManager.FindControl(_T("btn_wnd_min")));
	btn_max_ = dynamic_cast<CButtonUI*>(m_PaintManager.FindControl(_T("btn_wnd_max")));
	btn_close_ = dynamic_cast<CButtonUI*>(m_PaintManager.FindControl(_T("btn_wnd_close")));
}

这样我们通过 窗口管理器 m_PaintManagerFindControl 方法,借助控件名称找到了控件, FindControl 方法返回的是一个 CControlUI* 类型,通过动态类型转换到指定的控件类型,我们就拿到了这个控件的操作权。m_PaintManager 是在基类 WindowImplBase 中初始化和赋值的,有兴趣的可以跟进去看一下。一个基本的控件从创建到转换为可控的成员变量过程就是这样完成的,我们看到了 DuiLib提供了很多丰富的控件类型,但是最上面图中介绍的控件已经不全了,毕竟是很久以前的图片了,我们不能以这个为标准,一定要自己去翻翻代码。以下是我仅整理的控件相关的结构图,把目前 DuiLib所有包含的控件都列举出来了,分支关系代表继承关系箭头代表了多继承的父类之间的关系
在这里插入图片描述
从图中可以看出,布局类(或者说容器类)的 UI 组件都是继承与 CContainerUI,控件类的 UI 组件都是继承与 CControlUI。这也就是为什么上面类型转换可以转换为指定控件类型的原因了。大家目前只需要谨记这一点就足够我们应付绝大部分问题了。上面的代码仅仅是把 XML 中的控件转化成了可控的控件成员变量。更多情况下我们是通过用户操作窗口的事件来操作控件,接下来我们就来介绍,如果响应用户操作窗口的消息和事件,顺带着就把如何操作控件的状态就一并介绍了。

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

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

相关文章

每日一练 | 华为认证真题练习Day61

1、DHCPv6服务器发送的DHCPv6 ADVERTISE报文目的端口号为&#xff1f; A. 548 B. 547 C. 549 D. 546 2、当DHCPv6客户端收到DHCPv6服务器发送的RA报文中的和O标记位取值为下列哪个数值时&#xff0c;DHCPv6客户端采用DHCPv6有状态自动配置获取IPv6地址和其它配置信息&#…

Android libusb库的使用

Download Data Center Software from Total Phase. 1 Aptiv DABR Aptiv acquired Indian Unwired&#xff0c;Delphi Automotive USB Bridge / Hub&#xff0c;Hub中集成了UDC&#xff0c;upstream UDC连接的主机称为A-Host&#xff0c;downstream UDC被B-Host枚举成Relay devi…

一个床垫的故事

这是学习笔记的第 2460篇文章 这是一个床垫的真实故事&#xff0c;想起来还是蛮感慨的&#xff0c;真是太魔幻了。 起因是我哥搬家&#xff0c;有一个很新的品牌床垫&#xff0c;因为新房子那边买家具已经送了一个床垫了&#xff0c;所以就多出来一个床垫&#xff0c;他打算把…

autogpt的使用,还有出现的问题

AutoGPT简介 AutoGPT是一个实验性开源应用程序&#xff0c;展示了GPT-4语言模型的功能。该程序由GPT-4驱动&#xff0c;将LLM“思想”链接在一起&#xff0c;以自主实现您设定的任何目标。作为GPT-4完全自主运行的首批例子之一&#xff0c;AutoGPT突破了人工智能的极限。 注&a…

Opencv-C++笔记 (6) : opencv-图片和视频操作

文章目录 一、读取函数imread二、图片窗口函数namedWindow三、 图片保存Imwrite和显示函数Imshow四、视频数据的读取五、摄像头直接调用 一、读取函数imread cv::Mat cv::imread(const String & filename,int flagsIMREAD_COLOR)filename&#xff1a;需要读取图像的文件名…

Linux运维监控学习笔记4

Zabbix相关的一些概念&#xff1a; Zabbix用户和用户群组&#xff1a; 用户&#xff1a;Zabbix提供多用户管理&#xff0c;不同的用户可以设置不同的权限&#xff0c;不同的语言和不同的报警方式。 1&#xff09;创建用户&#xff1a;点击“创建用户”按钮&#xff1a; 2&…

NOTA PEG7 Azide,NOTA-七聚乙二醇叠氮,新型双功能整合剂

NOTA PEG7 Azide中NOTA及其衍生物是新型双功能整合剂之一。NOTA及其衍生物具有良好的配位和鳌合能力&#xff0c;可作为过渡金属离子的配体。叠氮化物基团可以参与铜催化的与炔部分的点击化学反应。 聚乙二醇在科研领域运用广泛&#xff0c;聚乙二醇具有良好的水溶性&#xff0…

【FPGA入门】第一篇、Verilog基本语法常识

目录 第一部分、不同的变量类型 1、wire和reg的区别 2、如何对变量进行赋值呢&#xff1f; 3、什么是阻塞&#xff1f;什么是非阻塞&#xff1f; 第二部分、变量位宽的定义 1、各种系统默认情况 2、变量位宽声明方式 3、表明位宽的情况下&#xff0c;赋值方式 4、两个模…

来自一个敲了5年代码的网络安全工程师的自述(目前薪资30K)

本人是一名敲了5年半代码的网络安全工程师&#xff0c;目前在杭州工作&#xff0c;月薪目前是在30.6K左右&#xff0c;经历过两次跳槽&#xff0c;第一次跳槽拿到了12K的offer&#xff0c;第二次跳槽拿到18K的offer。一直到目前为止的30K左右。 说到这里再给大家提个醒&#x…

SpringBoot整合定时任务技术Quartz

个人简介&#xff1a;Java领域新星创作者&#xff1b;阿里云技术博主、星级博主、专家博主&#xff1b;正在Java学习的路上摸爬滚打&#xff0c;记录学习的过程~ 个人主页&#xff1a;.29.的博客 学习社区&#xff1a;进去逛一逛~ RequestMapping注解 &#x1f680;Quartz应用场…

好消息!PMP证书还没过期的宝子,可以增持免考CSPM-2证书

2021年10月&#xff0c;中共中央、国务院发布的《国家标准化发展纲要》明确提出构建多层次从业人员培养培训体系&#xff0c;开展专业人才培养培训和国家质量基础设施综合教育。建立健全人才的职业能力评价和激励机制。由中国标准化协会&#xff08;CAS&#xff09;组织开展的项…

如何使用hexo next主题,新建一个专栏

文章目录 backgroundIntroHow to do that&#xff1f;&#x1f388; background 今天突发奇想&#xff0c;想要在自己的博客中增加一个新的专栏&#xff0c;记录自己的一些随想。起因是不想让博客成为一个纯粹记录技术成长的网站&#xff0c;&#xff08;毕竟如果真的有人要看…

PostgreSQL(八)锁的相关操作

目录 一、锁存在的意义二、表级锁1.ACCESS SHARE2.ROW SHARE3.ROW EXCLUSIVE4.SHARE UPDATE EXCLUSIVE5.SHARE6.SHARE ROW EXCLUSIVE7.EXCLUSIVE8.ACCESS EXCLUSIVE9.表级锁模式冲突表10.示例一11.示例二 三、行级锁1.FOR UPDATE2.FOR NO KEY UPDATE3.FOR SHARE4.FOR KEY SHARE…

那个准点下班的人,比我先升职了...

前言 二黑最近心态很崩。 和他同期一道进公司的陈琪又升了一级&#xff0c;可是明明大家在进公司时&#xff0c;喜子不论是学历还是工作经验&#xff0c;样样都不如自己&#xff0c;眼下不过短短的两年时间便一跃在自己的职级之上&#xff0c;这着实让他有几分不甘心。 二黑…

Unity 安装负责音频的 wwise

很多游戏的音频用的是 wwise 先下载 https://www.audiokinetic.com/zh/download 安装的时候要选sdk 就是20g的那个 然后运行 选择unity 可以看到这个界面 好&#xff0c;现在开始要安装离线包 直接项目里点 第二个 装好后 他会提示你 无法找到unity安装的地址 1 打开你的 …

干货 | 电路中为何需要串联小电阻?

电路中串联小电阻是电路设计中常见的一种技术手段&#xff0c;它可以在电路中起到多种作用。在本文中&#xff0c;我将从不同的角度分析串联小电阻的作用&#xff0c;深入探讨为何需要在电路中串联小电阻。 一、串联小电阻的概念和作用 串联小电阻是指在电路中串联一个电阻&am…

使用hutool实现entity转map、map转entity,以及entity转entity

前言 在项目开发中&#xff0c;entity的数据结构一般用来传参以及结果响应&#xff0c;但是在某些场景下&#xff0c;map可以实现list无法实现的效果。 比如&#xff1a;实现根据不同等级的用户&#xff0c;可以看到的数据的数量不一样。等级低的用户看到的某些字段是经过加密…

Redis入门 - 发布订阅

原文首更地址&#xff0c;阅读效果更佳&#xff01; Redis入门 - 发布订阅 | CoderMast编程桅杆https://www.codermast.com/database/redis/redis-pub-sub.html Redis 发布订阅 (pub/sub) 是一种消息通信模式&#xff1a;发送者 (pub) 发送消息&#xff0c;订阅者 (sub) 接收…

基于Java Web的墓地管理系统的设计与实现+第五稿+文档

博主介绍&#xff1a;✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 项目名称 基于Java Web的墓地管理系统的设计与实现第五稿文档 视频演示 视频去哪了呢&#xff1f;_哔哩哔哩_bilibili 系统介绍 3.3 角色分析 本系统一共分为…

微信小程序9大方面测试点全方位总结

微信小程序无需下载安装&#xff0c;用户在微信扫一扫或搜索即可使用&#xff0c;小程序版本类型可分为&#xff1a;开发版、体验版、正式版。 开发版、体验版无需审核&#xff0c;只需要给微信号权限&#xff0c;经过扫小程序的二维码就能访问&#xff0c;正式版本需要经过微…