duilib学习

记录duilib自学过程。

最近年底公司也没啥事情,自己就想着上网看看duilib怎么制作界面,因为之前想学习一直没时间,现在来看看。

其实学习的就好办法就是看demo,关于duilib网上的学习教程并不多,自己跟着demo敲一遍代码大概就知道怎么回事了。我自己是下了这个demo.

里面有个duidemo工程,里面有较多控件,基于这个demo就可以修改成自己想要的界面。一边修改一遍学习。

首先是duilib库的引入,我个人是使用DLL的方式,什么头文件源文件一起打包到工程里面,用DLL静态链接的方式引入到win32工程中就可以了。需要引入的头文件是 #include <UIlib.h>。编译没问题就可以开始了。 按照上面说的是修改duidemo的工程,直接将duidemo文件夹拷贝出来编译下图就是程序运行成功的界面。
duidemo原样
可以看出里面已经有很多控件了,那我们需要的关注的就是怎么使用这些控件以及窗口管理

duilib的消息机制就像是MFC那样的,具体区别我也没太去研究,这里只关注怎么使用。先看工程里面DuiDemo.h和DuiDemo.cpp,程序入口就在DuiDemo.cpp里面,函数如下:

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE /*hPrevInstance*/, LPSTR /*lpCmdLine*/, int nCmdShow)
// 创建主窗口CMainWnd* pMainWnd = new CMainWnd();if( pMainWnd == NULL ) return 0;pMainWnd->Create(NULL, _T("sqlop"), UI_WNDSTYLE_FRAME, 0L, 0, 0, 800, 572);pMainWnd->CenterWindow();

上面就是创建主窗口的代码,重点关注CMainWnd这个类,找到这个类的文件。duilib的窗口布局都是基于XML文件的,所以CMainWnd首先会找到自己的布局文件XML_MAIN,这里是做了映射吧,对应的XML文件时main.xml,我没注意看,后续我自己的窗口都是用xxx.xml这种名称加载XML布局文件的。加载布局函数是DuiLib::CDuiString GetSkinFile();可以看到里面返回了一个XML文件的名称,你可以试试修改成其它错误的名称,就会导致程序报错,因为找不到相应的XML文件。

再来值得关注的函数还有void InitWindow();
这个函数使用了做窗口的初始化的,你可以在里面获取到XML里面的控件对应的句柄,然后用句柄做一些相应的初始胡。比如:

//获取树形控件句柄,控件名称为treeview
CTreeViewUI* treeview = static_cast<CTreeViewUI*>(m_pm.FindControl(_T("treeview")));
if (treeview)
{CTreeNodeUI* pNode = new CTreeNodeUI();pNode->SetFixedHeight(30);pNode->SetItemText(L"123");treeview->AddAt(pNode, 0);pNode->SetAttribute(_T("itemattr"), _T("valign=&quot;center&quot;"));pNode->SetAttribute(_T("Style"), _T("treeview_item_style"));
}

控件在XML中都是或者这样方式写的,像上面的tree控件在XML写为

<TreeView name="treeview" bkcolor="#ffffffff" visiblefolderbtn="true" visiblecheckbtn="false" vscrollbar="true" >

获取句柄的方式:m_pm.FindControl(_T(“树形控件的name”))),注意使用的时候判断一下句柄是否为空,若是返回NULL还是使用改句柄会造成程序报错。
记获取XML控件句柄方式:CxxxUI* myUI= static_cast<CxxxUI*>(m_pm.FindControl(_T("控件name")));

看看所有控件的父类,你都会发现所有控件都会继承CControlUI类。所以,所有类都会有一些共用的方法,比如:

  1. virtual void SetVisible(bool bVisible = true);//控件可见性
  2. virtual void SetText(LPCTSTR pstrText);//设置控件文本

接下来需要关注的函数是void Notify(TNotifyUI& msg);这个函数会接收窗口的所有消息,所以我们很多响应操作都是在这里完成的。TNotifyUI& msg;包含了消息的相应类型,可以根据里面的类型进行判断。

CDuiString name = msg.pSender->GetName();

这一句是获取到对应消息的控件的名称,也就是XML文件里面控件的name属性。

msg.sType;

这个是消息的类型,比如单击为if( msg.sType == _T("click") );双击树形控件节点为if (msg.sType == DUI_MSGTYPE_TREEITEMDBCLICK);

#define DUI_MSGTYPE_TREEITEMDBCLICK 		(_T("treeitemdbclick"))

在判断消息类型的时候可以使用UIDefine.h里面的宏定义也可以直接使用字符串的形式,都是一样的。

上面都是系统消息,duilib也是可以做自定义消息的。
首先要定义消息映射表。
//头文件

DUI_DECLARE_MESSAGE_MAP()

//源文件

DUI_BEGIN_MESSAGE_MAP(CMainPage, CNotifyPump)DUI_END_MESSAGE_MAP()

是不是觉得很熟悉,其实跟MFC的消息映射时一样的,使用PostMessage或者SendMessage都是可以触发消息从而跳转到映射的函数里面,具体不做展开,可以自行百度MFC自定义消息,或者之间百度duilib自定义消息,很简单的。

太多了,就写到这里,还是需要自己去实践使用才能逐渐掌握。下面是我自己做的一个数据库查询工具,数据库是mysql的,所以还添加mysql的库,因为需要导出的文件是xlsx/xls,所以还需要添加libxl库。界面截图。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
代码下载链接:https://download.csdn.net/download/qq_27731413/14675848

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

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

相关文章

记:ubuntu下交叉编译arm的链接库

以第三方库libjpeg为例&#xff0c;编译所需要的三步&#xff1a; 1、配置./configure脚本参数&#xff0c; ./configure --prefix/home/huanghaitao/Winshare/jpeg-9c/libjpeg CCarm-linux-gnueabihf-gcc --hostarm-linux --enable-shared --enable-static–prefix&#xff0…

flash 绘图API:绘制弧线

把之前没有记录的笔记都记录一下&#xff0c;顺便方便日后查询。绘制弧线&#xff0c;对于一些制作课件的人来讲会有一些用处的。绘制弧线采用的基本思路是采用描点的方法实现。从一个开始角度&#xff0c;到另一个角度结束&#xff0c;在这个角度区间里面进行描点连线。 【A&a…

关于SDL SDL_CreateWindowFrom和SDL_DestroyWindow第二次后无法将视频显示出来。

最近自己用QT搞一个监控平台的程序UI&#xff0c;然后后台一些视频处理是使用FFMPEG和SDL来做的。 在关闭播放窗口SDL_DestroyWindow后&#xff0c;再次去显示视频就会发现显示不出来。代码如下 int SDLPlayer::SDLPlay() {SDL_Window *sdlScreen{ NULL };//窗口SDL_Renderer*…

vos限制客户呼出时间

问题&#xff1a; 公司希望自己的卡线晚上 21&#xff1a;00-24&#xff1a;00 早上00&#xff1a;00-7&#xff1a;30不能打出电话&#xff0c;以防遭投拆&#xff0c; 那么如何设置&#xff1f; 方法&#xff1a; 找到客户使用的落地网关&#xff0c; 落地网关——补充设置…

QT-监视平台

空余时间学习QT的UI&#xff0c;做了一个监视平台&#xff0c;直接上图。 页面1&#xff1a;视频监控 页面2&#xff1a;视频回放 页面3&#xff1a;系统设置 未完成。。。。。。。。 做的不好的地方请大家指正&#xff0c;项目现在还在开发阶段&#xff0c;仅供学习参考…

Orchard架构介绍

在如何使用Orchard搭建敏捷个人的网站&#xff08;2&#xff09;中 介绍了如何使用Orchard&#xff0c;但对于我们来说&#xff0c;更重要的是学习Orchard是如何架构的&#xff0c;如果我们自己编写一个类似应用该如何做。今天有空再次看看 Orchard的其它内容&#xff0c;本篇介…

【服务器】一次对Close_Wait 状态故障的排查经历

最近接连听说一台线上服务器总是不响应客户端请求。 登录服务器后查询iis状态&#xff0c;发现应用程序池状态变为已停止。 按经验想&#xff0c;重启后应该就ok&#xff0c;第一次遇到也确实起了作用&#xff0c;当时完全没在意&#xff0c;以为是其他人无意把服务关闭了而已。…

听力阈值计算_中耳功能分析:临床听力测试的重要手段!

点击甘峰听力关注我们中耳功能测试是临床听力学测试中一个重要部分&#xff0c;和常规的气、骨导纯音测试不一样&#xff0c;中耳功能测试从测试的内容看&#xff0c;主要有鼓室声导抗测试、声順值测试、镫骨肌反射阈值测试、咽鼓管功能测试等。从测试的原理看&#xff0c;现代…

go json 自定义_Go语言Echo Web框架9-日志

上一节:Go语言Echo Web框架8-JWT 这一节介绍日志echo自带的日志中间件记录有关每个HTTP请求的信息日志日志中间件用法e.Use(middleware.Logger())样本输出{ "time":"2020-09-13T21:58:07.372015644-08:00", "remote_ip":"::1", &…

cad文字递增快捷键_十年经验总结,100个CAD快捷键。

CAD绘图快捷键命令&#xff1a;1. 圆 > C2. 点 > PO3. 直线 > L4. 圆弧 > A5. 椭圆 > EL6. 表格 > TB7. 矩形 > REC8. 面域 > REG9. 创建块 > B10. 插入块 > I11. 多段线 > PL12. 构造线 > XL13. 图案填充 > H14. 样条曲线 > SPL15.…

实验5: IOS的升级与恢复

实验5: IOS的升级与恢复 实验目的通过本实验可以掌握 1) 掌握IOS 正常的情况下升级IOS2) IOS 丢失的情况下使用TFTP恢复IOS3) IOS 丢失的情况下使用Xmodem恢复IOS 拓扑结构 实验步骤n IOS 正常的情况下升级IOS (TFTP)Router#conf t //进…

MYSQL:基础——触发器

MYSQL基础——触发器 引入触发器 什么是触发器 如果你想要某条语句(或某些语句)在事件发生时自动执行。比如&#xff1a; 每当订购一个产品时&#xff0c;都从库存数量中减去订购的数量&#xff1b;无论何时删除一行&#xff0c;都在某个存档表中保留一个副本。就需要用到触发器…

双线macd指标参数最佳设置_常用指标知多少(二)

均线日期的选择种类有很多&#xff0c;一般行情软件常用的均线日期是5日、10日、20日、30日和60日&#xff0c;一般也会默认是这些日期&#xff0c;也有的加上了长线的120日和250日&#xff0c;很好理解&#xff0c;因为每周交易日是5天&#xff0c;所以以倍数做比较。使用海龟…

图片合成gif_使用在线图片工具处理静态和动态图片的技巧

图片一般分为两种&#xff0c;一种是静态图片&#xff0c;常用的图片格式有jpg&#xff0c;png等。处理静态图片可用用手机自己带的图片处理工具处理&#xff0c;也能够使用线上的在线作图工具来进行操作&#xff0c;比如找图设计&#xff0c;懒设计&#xff0c;稿定设计等设计…

Redis源代码分析之sds, 动态数组

Redis是用C语言编写的。C语言处理字符串一向是个难点。很容易出现内存越界问题。 其它高级语言很容易实现的字符串拼接&#xff0c;在C这里却是百般艰难。因为需要实现计算出字符串所占内存的大小。即不能过大&#xff08;浪费内存&#xff09;&#xff0c;也不能太小&#xff…

C#委托的异步调用[转]

本文将主要通过“同步调用”、“异步调用”、“异步回调”三个示例来讲解在用委托执行同一个“加法类”的时候的的区别和利弊。 首先&#xff0c;通过代码定义一个委托和下面三个示例将要调用的方法&#xff1a; /*添加的命名空间using System.Threading;using System.Runtime.…

钉钉微应用怎么进入_蓝凌携手钉钉走进越秀地产,零距离热聊企业数字化转型...

8月18日&#xff0c;蓝凌携手钉钉一同走进越秀地产&#xff0c;举办了《地产行业数字化实战闭门分享会》主题活动&#xff0c;与30余名嘉宾欢聚一堂&#xff0c;体验智慧管理实践与数字工作模式&#xff0c;探索企业数字化转型升级之道。越秀地产CIO陈磊、越秀地产信息总监郑毅…

mysql5.7半自动同步设置【转】

mysql的主从复制主要有3种模式&#xff1a; a..主从同步复制&#xff1a;数据完整性好&#xff0c;但是性能消耗高 b.主从异步复制&#xff1a;性能消耗低&#xff0c;但是容易出现主从数据唯一性问题 c.主从半自动复制&#xff1a;介于上面两种之间。既能很好的保持完整性&…

Android之旅---广播(BroadCast)

什么是广播在Android中&#xff0c;Broadcast是一种广泛运用的在应用程序之间传输信息的机制。我们拿广播电台来做个比方。我们平常使用收音机收音是这样的&#xff1a;许许多多不同的广播电台通过特定的频率来发送他们的内容&#xff0c;而我们用户只需要将频率调成和广播电台…

python牛客网编程题_【面经】小米软件开发一面(python)面经 2020 2020

作者&#xff1a;JessyTsuihttps://www.nowcoder.com/discuss/580721?type2&order0&pos15&page1&channel-1&source_iddiscuss_tag_nctrack来源&#xff1a;牛客网小米软件开发一面(python)面经一共三轮技术面&#xff0c;第四轮是HR面&#xff0c;已OC&am…