DuiLib中窗口的创建

    以前基本没有写博客记录工作学习中遇到的问题及解决方法的习惯,就发现过段时间后学习的东西就忘掉了。因此,今天决定将自己的学习成果记录下来,以后后面参考。

    一直以来,自己对界面实在不怎么感冒,学习MFC也是断断续续的看过一些,由于工作中没有直接用MFC做复杂的东西,所以MFC也只是一个皮毛。后来,听朋友说她在驱动人生的时候,驱动人生使用的界面库叫做Duilib。看了下百度,竟然还是国产的,必须得支持一下。下面将这段时间断断续续的看的Duilib的一些东西记录下来。

    Duilib,它只是一个界面,不像MFC那样的应用框架,不包含其他的一些常用功能,例如:线程、进程、日志系统、文件保存等功能,这些都需要运用windows系统函数或者C库函数来完成。因此,可以明确,Duilib仅仅只是一个界面库,我们用它来做展示的东西。自己在学习中遇到的问题,大致如下:

    1、Duilib中窗口的创建:在Duilib中,有一个CWindowWnd类,我们在创建自己的窗口时,可以从这个CWindowWnd进行继承,其中有注册、创建和其他的一些窗口的操作,我们就不用自己再进行编写了。另外一个重要的类就是CPaintManagerUI,一般是一个窗口带一个CPaintManagerUI的对象,用其来进行对控件的操作。Duilib中的控件,不同于MFC中的控件。Duilib中,所有的控件不是一个独立的子窗口,而是由程序自己画到窗口上的。所有的这些控件,都有CPaintManager对象来进行管理。    

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

    3、知道了上面两点,我们就可以自己动手做些简单的UI界面。当然,界面要漂亮,离不开一套漂亮的图片。这里,图片尽量使用png格式的图片,因为png格式的图片有两个优点我们是需要用到,1) png图片的压缩了高,节省空间。2) png图片一般带有alpha通道,即透明通道,这样我们就可以做出来很炫的界面。例如,想很多软件里面看到的圆形button。

    4、Duilib中,将系统消息再做了一次封装,这样,我们只要将我们的窗口类使用多继承,再继承INotifyUI类。其实,从这个名字上我们可以看出,这是一个接口类,虽然C++中不支持接口(Java)这个技术,但是我们还是可以使用它的定义。在INotifyUI中,其实只有一个函数共有的未实现的虚函数Notify,我们在我们的窗口类中继承了INotifyUI类后,就需要在我们的类中实现这个Notify的方法。一般,我们需要的一些消息就可以在其中进行处理,例如,单击、双击 或者还有菜单创建等一些消息。

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

    第一次写博客,语言组织能力还是有待提高。

posted @ 2016-06-01 16:47  太极者  阅读(4229)  评论(0编辑  收藏  举报