Duilib整体框架

来源:互联网 发布:android官方文档 知乎 编辑:程序博客网 时间:2024/05/18 00:25

一、Duilib的整体架构


二、Duilib框架基本流程(Win32创建窗口流程)

         第一步:实例句柄与渲染类关联

                                  CPaintManagerUI::SetInstance(hInstance);

                CPaintManagerUI::SetResourcePath(LPCTSTRpStrPath)

         第二步: 初始化COM库, 为加载COM库提供支持

            ::CoInitialize

    第三步:创建窗口类

    第四步:调用CWindowWnd::Create创建窗口,Create函数实现了注册窗口,指定回调函数,创建窗口,处理消息等。

    第五步:窗口居中   

            CWindowWnd::CenterWindow

       第六步:处理消息循环

                     CPaintManagerUI::MessageLoop

    第七步:CPaintManagerUI::MessageLoop

            ::CoUninitialize()

三、Duilib窗口元素的创建机制

    第一步:响应WM_CREATE消息

    第二步:主窗口类与窗口句柄关联

              m_pm.Init(m_hWnd)

     第三步:加载XML并动态创建界面无素,与布局界面元素

                   CDialogBuilder builder;

                            CDialogBuilderCallbackEx cb;

                            CControlUI* pRoot =builder.Create(_T("skin.xml"), (UINT)0,  &cb, &m_pm);

        第四步:附加控件到HASH表

                CPaintManagerUI::AttachDialog

                                 InitControls

                                          FindControl

                                                  __FindControlFromNameHash

                                                 pManager->m_mNameHash.Insert

       第五步:添加通知处理

                CPaintManagerUI::AddNotifier

       第六步:窗口的绘制(以上是窗口的创建过程,通过xml,所有控件都被加载到CPaintManagerUI

            CPaintManagerUI响应WM_PAINT消息,开始双缓存绘图

                     m_pRoot->DoPaint绘背景图 

                 CControlUI::DoPaint

                 CRenderEngine 真正的绘图类

             pPostPaintControl->DoPostPaint 在背景图上绘制控件

            ::BitBlt 把离屏视图画到主屏上

四、Duilib消息处理机制:

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

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

         第二步:消息分发

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

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

         第三步:消息循环

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

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

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

         第四步:处理控件消息

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

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

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


原创粉丝点击