Duilib 使用的一些记录-01

Duilib 使用的一些记录-01

基本使用

基本的使用不多说了,网上的教程应该写的很好。这里做个统计与整理。GitHub上搜索下就可以获取到最新的库版本。有很多改版库的,大家都可以看看。
搜索一下或者认真看看源码带的Demo也基本上能了解个大概。
这里记录下,我使用时候遇到的一些问题。

开始

基本介绍

先弄清楚怎么运行的最重要了。先来个简单的duilib框架吧。
整体框架
这个框架图我在网上找的 应该是比较老的了。但是总体上来说是没有问题的。

整体结构

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

库的组成

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

  1. 工具类;主要指的是基本的绘图元素(cpoint等),简单的容器(cduistring等),简单的第三方库(zip)
  2. 控件类;所有UI的实现控件。
  3. 核心类;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了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值