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,一经查实,立即删除!

相关文章

2017.12.1T19_B2_2zuoye

package com.whxiong.work01; import java.util.Scanner; public class Calculator { Scanner input new Scanner(System.in); public void show() { char Calculator; double num 0; double num1 0; System.out.println("请输入第一个整数&#xff1a;"); …

git指令快捷 idea_IDEA+Git+Gitlab使用详细教程

GitLab 安装踩坑502错误码和访问卡顿解决办法Gitlab对内存的要求高&#xff0c;我的服务器Centos 72核心2G内存&#xff0c;频繁报502错误&#xff0c;访问也很卡。原因可能是可用内存太少。# free -m 查看可用内存这里看到free不多了&#xff0c;解决办法有扩内存或者使用虚拟…

记: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…

scala中Stream理解

// Stream:Stream is lazy List;// Stream惰性求值指它只确定第一个值&#xff0c;后面的值用到再求值&#xff0c;这样可以防止数据过大全部加载导致内存溢出// 将Range转化成Streamval stream (1 to 1000).toStreamprintln(stream) // Stream(1, ?)println(stream.head…

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

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

简单概念

一、数据库查询I. 直接生成sql语句。 sql server每次都要对其进行编译&#xff0c;在性能方面不会有很大的提高。另外也不够安全。容易被攻击.II. 使用带参数的sql命令。这种方式sql server只对其编译一次&#xff0c;对于不同的参数可以重复使用编译后的命令。提高了性能.III.…

瘦子的肠道菌群和胖子的区别_胖子和瘦子的终极 PK:比基因?比运动?比肠道细菌!...

学术会议的自助餐厅里碰见了小师妹&#xff0c;小师妹餐盘里的食物堆成了小山&#xff0c;几位同学指指小师妹的「救生圈」说道&#xff1a;「多日不见&#xff0c;增肥不少&#xff0c;看来这世间没有无缘无故的胖&#xff0c;也没有无缘无故的瘦啊&#xff01;」小师妹一脸委…

转: Vim快捷键分类

Vim快捷键分类 http://www.cnblogs.com/jikey/archive/2011/12/28/2304341.html 一. 移动&#xff1a;h,j,k,l: 左&#xff0c;下&#xff0c;上&#xff0c;右。w: 下一个词的词首。e:下一个词的词尾。b:上一个词的词首。<>: v 模式选中后进行缩进。二. 跳转&#xff1a…

FFMPEG av_frame_move_ref 使用

最近使用ffmpeg总会碰到视频帧拷贝的问题&#xff0c;其中av_frame_move_ref 就可以实现视频帧的拷贝功能。 函数原型&#xff1a; void av_frame_move_ref(AVFrame *dst, AVFrame *src);使用方法&#xff1a; AVFrame *dst av_frame_alloc(); AVFrame *src av_frame_alloc…

HTTP详解(转载)

HTTP是一个属于应用层的面向对象的协议&#xff0c;由于其简捷、快速的方式&#xff0c;适用于分布式超媒体信息系统。它于1990年提出&#xff0c;经过几年的使用与发展&#xff0c;得到不断地完善和扩展。目前在WWW中使用的是HTTP/1.0的第六版&#xff0c;HTTP/1.1的规范化工作…

cmos存储器中存放了_CMOS存储器中存放了计算机的一些参数和信息,其中不包含在内的是( )。_学小易找答案...

【单选题】在计算机网络中,( )用于验证消息发送方的真实性。【单选题】【单选题】质点做半径为 R 的变速圆周运动时 , 加速度大小为 ( v 表示任一时刻质点的速率 ) ( )【单选题】在PC机中,输入/输出设备通过( )与各自的控制器连接起来。【多选题】一质点沿半径为R的圆周运动,路…

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;现代…

大话移动开发之QT-Quick

大话移动开发之QT-Quick 这是一段关于移动开发之QT-Quick开发的音频&#xff0c;由嘉文&鲜橙&李唐三位朋友录制&#xff0c;内容非常丰富&#xff0c;希望大家喜欢。 节目介绍&#xff1a; 如今的智能终端市场风起云涌&#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", &…

C++提取PDF页成BMP图片

背景&#xff1a;之前接了一个小单子&#xff0c;需求就是将PDF转成.tif图片&#xff0c;刚好闲着&#xff0c;就搜了许多资料&#xff0c;最后选择的是PDFium SDK。 1、首先是打开PDF文件&#xff0c; //chPDF为文件路径 FPDF_DOCUMENT pdf_doc FPDF_LoadDocument(chPDF, NU…