duilib 子窗口位置_Duilib窗口创建分析
发布日期:2021-10-27 12:03:49 浏览次数:2 分类:技术文章

本文共 2032 字,大约阅读时间需要 6 分钟。

最近一直以来都在用Duilib做界面,说是在开发界面其实是一边学一边做,本人也是于17年的春节过后开始正式接触这个界面库在此前根本没有听说过个,现在趁领导出差的时间

我把Duilib的窗口创建过程的写出博客记录下来,方便自己和新手以后学习作为参考。Duilib它作为一个界面库,所以不像MFC那样几乎所有的Windows的API都封装,虽然现在MFC现在不再更新库了但是里面的功能是非常强大的所以我的理解是MFC要比Duilib功能强大,呵呵,虽然本人就是学了MFC

好几个月也没有做出漂亮界面,但不能说MFC不能做出漂亮的界面,言归正传。可以明确一点就是Duilib仅仅只是一个界面库,用它做界面能够提高很大效率。整个窗口的创建过程大致如下:

1、Duilib中窗口的创建:在Duilib中有个一个WindowImplBase

它继承自CWindowWnd类,所以我们可以看出Duilib中如果要界面可以继承自这两类其中任何一个,WindowImplBase这个类就是处理很多跟窗口相关的东西,等于减轻了很多常用处理,当然也可以直接继承CWindowWnd类,需要自己处理一些常用消息。这里就拿CWindowWnd类来讲,因为CWindowWnd类里面有注册、创建和一些窗口的操作,我们就不用自己进行编写了,另外一个重要的类就是CPaintManagerUI,一般我们的一个窗口都会带一个CPaintManagerUI的对象,用其来进行空i吉安的操作。Duilib中空间,不同与MFC中的空间,Duilib中所有的空间不是一个独立的子窗口,而是由程序自己画到窗口上的。所有这些控件都有CPaintManagerUI对象来进行管理。

2、CPaintManagerUI类里面有一个静态方法MessageLoop(),来完成windows消息循环即GetMessage、TranslateMessage()、DispatchMessage这三个函数。学过win32应用程序的同学都知道,在调用过创建窗口CreateWindowEX后,在此函数未返回之前,会发送WM_NCCREATE的消息这个消息就是创建客户区意外的东西。Duilib在这里使用一个小技巧,在调用了CreateWindowEX时,在函数的对应一个参数,传入了当前窗口的指针。这个指针在处理WM_NCCREATE时候,可以从通过参数LParam经过一定的变换获取到当前窗口。由于窗口处理函数是一个静态函数,所以在其中我们就可以使用才获取到的窗口指针,调用我们自己年编写的消息处理函数。在我们自己编写的函数中,我们自己可以拦截一些我们需要的消息,例如:我们自己自绘标题栏时,这时的窗口是无法像我们图片的窗口那样,在窗口的标题栏处,按下鼠标左键然后拖动窗口,此时,我们就可以拦截取系统消息WM_NCHITTEST,在其中我们做相应的判断,返回相应的值,就可以实现拖动的功能。其实我们继承了WindowsImplBase这个类里面OnNcHitTest已经处理基本常用的这种功能了。系统的CPaintManagerUI类中,也有对常用消息做处理、例如单击、双击等。此时,我们可以调用CPaintManager中的MessageHandler来处理例如绘图等消息。

3、知道上面的2点其实就可以动手根据Demo做一些UI界面,界面漂亮就需要漂亮的图片,虽然图片有多种建议使用PNG格式,因为png格式的图片有两个好处,1、压缩度高。2、png图片一般都带有alpha通道:透明通道,这样就可以做出来很炫的界面。例如很多软件里面看到的圆形button。

4、Duilib中,将系统消息再做了一次封装,这样我们只要将我们的窗口类使用多继承,再继承INotifyUI类。

多继承类似下面

: public CWindowWnd

, public CNotifyPump

, public INotifyUI

, public IMessageFilterUI

, public IDialogBuilderCallback

, public IQueryControlText

从名字上可以看出INotifyUI就是一个接口类,虽然C++不支持接口(JAVA)技术,但是我们还是可以使用它的定义。在INotifyUI中,其实只有一个公共函数未实现的虚函数Notify,我们在我们的窗口类中继承了INotifyUI类后,就需要在我们的饿类中实现这个Notify的方法。一般我没呢需要的一些消息就可以在这个处理,例如:单击、双击或菜单创建的等一些消息。

其实正如上面所说在DUILIB库里面封装好的一个WindowImplBase类。其实我们在把基础理解透彻后,再去使用这个类就会明白,其实它也是把一些常用的东西进行封装,而使得我们更加方便使用。

此博客根据自己的实际和一些网上博客学习得出的经验希望能帮助到大家!!!!

转载地址:https://blog.csdn.net/weixin_34620658/article/details/113894770 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:linux设置操作系统安装盘的iso文件为安装源安装mysql服务_Linux 操作系统安装盘的定制...
下一篇:mysql查询市区县_通过数据库获取省份城市区县的名字

发表评论

最新留言

留言是一种美德,欢迎回访!
[***.207.175.100]2024年04月06日 15时36分10秒