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

Duilib整体框架

2017-06-11 07:03 435 查看
一、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回调控件注册的事件。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: