您的位置:首页 > 产品设计 > UI/UE

Duilib 使用的一些记录-01

2016-12-21 11:04 302 查看

Duilib 使用的一些记录-01

基本使用

基本的使用不多说了,网上的教程应该写的很好。这里做个统计与整理。GitHub上搜索下就可以获取到最新的库版本。有很多改版库的,大家都可以看看。

搜索一下或者认真看看源码带的Demo也基本上能了解个大概。

这里记录下,我使用时候遇到的一些问题。

开始

基本介绍

先弄清楚怎么运行的最重要了。先来个简单的duilib框架吧。



这个框架图我在网上找的 应该是比较老的了。但是总体上来说是没有问题的。

整体结构

基本模块和基本的类继承情况如图。大体上的情况下图已经写的清楚了。可能近来有更新的情况,有点不同。但是大体上应该相同。



库的组成

Duilib库组成,可以简单的分为三块。分别是

工具类;主要指的是基本的绘图元素(cpoint等),简单的容器(cduistring等),简单的第三方库(zip)

控件类;所有UI的实现控件。

核心类;XML解析,绘图渲染等

控件的基类

CControlUI 是所有控件的基类。也是组成控件树的基本元素,控件树中所有的节点都是一个CControlUI。它基本包括了所有控件公共的属性,如:位置,大小,颜色,是否有焦点,是否被启用等等。当然这个类中还提供了非常多的基础函数,用于重载来实现子控件,如获取控件名称和ClassName,是否显示等等。


容器的基类

有了基本的控件基类之后,我们就需要容器来将他管理起来,这个容器就是CContainerUI,其内部用一个数组来保存所有的CControlUI的对象,后续的所有工作,就都是基于这个对象来进行的了。
子控件的管理,例如查找与其生命周期的问题,都是在此类中完成。


窗口的创建

窗口的窗口跟WIN32差不多。如下

详细情况在注释中有写的。整体来说窗口创建的情况还是很清晰的。

创建过程中其中较为重要是XML的解析加载绘制了。推荐可以跟着代码进去看看整个流程过一遍,这样能够更好的了解duilib。

intAPIENTRY WinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,LPSTRlpCmdLine,intnCmdShow)
{
CPaintManagerUI::SetInstance(hInstance);       // 第一步: 实例句柄与渲染类关联
CPaintManagerUI::SetResourcePath(CPaintManagerUI::GetInstancePath() + _T("skin"));//指定资源目录
HRESULTHr = ::CoInitialize(NULL);              // 第二步:初始化COM库, 为加载COM库提供支持
if( FAILED(Hr) ) return0;
CMainFrameWnd* pFrame = newCMainFrameWnd();   // 第三步:创建窗口类
if( pFrame == NULL ) return0;
pFrame->Create(NULL, _T("主程序"), UI_WNDSTYLE_FRAME, 0L, 0, 0, 800, 600); // 第四步:注册窗口类与创建窗口
//  实际上这里调用Create操作和Win32创建窗体一样,内部实际上做了以下操作:
//  -> RegisterSuperclass (注册一个超类 即已有一个窗口类的基上再注册一个窗口类)
//  -> RegisterWindowClass (注册窗口类)
//  -> ::CreateWindowEx (创建窗口,此时触发 WM_CREATE 消息)
//  -> HandleMessage  ( WM_CREATE消息处理OnCreate)
pFrame->CenterWindow();         // 第五步:窗口居中显示
::ShowWindow(*pFrame, SW_SHOW);
CPaintManagerUI::MessageLoop();// 第六步:处理消息循环
::CoUninitialize();            // 第七部:退出程序并释放COM库
return0;
}


消息响应

第一步:注册消息处理函数

在CWindowWnd注册窗口(RegisterWindowClass())里,注册消息回调函数(__WndProc);

第二步:消息分发

消息回调函数(处理所有系统发送的消息),然后回调函数通过子类的CMainFrameWnd::HandleMessage对消息进行分发。

非窗口消息通过CMainFrameWnd::HandleMessage调用CPaintManagerUI::MessageHandler进行分发。


第三步:消息循环

在CPaintManagerUI类的MessageLoop处理消息循环;

接收到消息以后,进入消息回调函数(__WndProc);


第四步:处理控件消息

(注:以下内容以鼠标单机Button事件为例)

例如:鼠标按下时(WM_LBUTTONDOWN),查找鼠标点击的控件。

处理控件的鼠标按下消息:通过调用基类CControlUI:: DoEvent,引起子类如CButtonUI::DoEvent事件。

子类的DoEvent对不同类型的事件进行处理。通过CPaintManagerUI:: SendNotify回调控件注册的事件。


Duilib 01

很不善于表达啊,很多都是前人已经完成的,写的挺好的。直接copy了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Duilib-记录