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回调控件注册的事件。
二、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回调控件注册的事件。
相关文章推荐
- 基于360SafeDemo对duilib整体框架的概述
- Duilib学习笔记《01》— duilib整体框架认识
- Duilib学习笔记《01》— duilib整体框架认识
- Duilib学习笔记《01》— duilib整体框架认识
- Duilib学习笔记《01》— duilib整体框架认识
- Duilib学习笔记《01》— duilib整体框架认识
- Duilib学习笔记《01》— duilib整体框架认识
- Duilib整体框架
- strongswan4.3.6 整体框架
- Android整体框架
- DIY.NETORM框架——整体分析
- 淘宝Fourinone四合一分布式计算框架整体介绍
- TCPMP之旅(一) TCPMP整体软体框架
- duilib整体介绍
- SSH整体框架理解
- Android 事件输入系统整体框架
- 赛艇数据采集整体框架
- Spring 框架学习(一):设计理念、整体架构
- 如何使frameset框架的页面通过滚动条整体移动
- uboot源码整体框架