转载自:http://www.who1753.com/duilib-study-04.html
在前面已经了解了duilib控件以及界面布局相关内容,接下来就要考虑该如何将xml中描述的布局通过界面展现出来。实际上在 Duilib学习笔记《01》 中我们已经简单提到过基本的流程及元素创建机制。这里我们直接用 Duilib学习笔记《03》最后提供的代码,下面我们就具体来说明:
一. duilib调用设置
1 |
#include "..\DuiLib\UIlib.h" |
2 |
using namespace DuiLib; |
5 |
# pragma comment(lib, "..\\bin\\DuiLib_ud.lib") |
7 |
# pragma comment(lib, "..\\bin\\DuiLib_d.lib") |
11 |
# pragma comment(lib, "..\\bin\\DuiLib_u.lib") |
13 |
# pragma comment(lib, "..\\bin\\DuiLib.lib") |
在工程中的stdafx.h头文件中添加上述代码。当然,也并不一定非要在stdafx.h文件中添加,根据自己工程的实际情况进行设置即可。
二. 窗体类
在duilib中,所有的窗口均继承自CWindowWnd类,在CWindowWnd类中由虚函数HandleMessage来处理Windows消息(如WM_CREATE、WM_SIZE等等),所以对于本例的窗体类,同样需要继承CWinowWnd,同时窗体类中需要重写虚函数HandleMessage用于Windows消息的处理。
而对于duilib,我们此时更关心是界面元素是如何创建显示出来的。实际上,在Create创建窗体类时会触发WM_CREATE消息,这个消息也就都由窗体类中的HandleMessage函数来处理,具体可查看示例代码窗体类中该函数。WM_CREATE消息对应的消息处理函数OnCreate:
1 |
LRESULT CMainWndDlg::OnCreate( UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL & bHandled ) |
3 |
m_PaintManager.Init(m_hWnd); |
4 |
CDialogBuilder builder; |
5 |
CControlUI* pRoot = builder.Create(_T( "DemoSkin.xml" ), ( UINT )0, NULL, &m_PaintManager); |
6 |
ASSERT(pRoot && "Failed to parse XML" ); |
7 |
m_PaintManager.AttachDialog(pRoot); |
在窗体类的OnCreate函数中加载窗体对应的XML布局文件并动态创建界面元素。
三. 入口函数——初始化并创建显示窗口类
1 |
int APIENTRY _tWinMain( HINSTANCE hInstance, |
2 |
HINSTANCE hPrevInstance, |
6 |
CPaintManagerUI::SetInstance(hInstance); |
7 |
CPaintManagerUI::SetResourcePath(CPaintManagerUI::GetInstancePath()); |
9 |
HRESULT Hr = ::CoInitialize(NULL); |
10 |
if ( FAILED(Hr) ) return 0; |
12 |
CMainWndDlg* pMainDlg = new CMainWndDlg(); |
13 |
pMainDlg->Create(NULL, _T( "Demo窗体" ), UI_WNDSTYLE_FRAME, WS_EX_WINDOWEDGE); |
14 |
pMainDlg->CenterWindow(); |
15 |
pMainDlg->ShowModal(); |
16 |
CPaintManagerUI::MessageLoop(); |
在入口函数中设置相关初始化,然后创建窗口,这样一来,编译运行即可显示对应的窗口。
四. 额外说明:XML加载
(注:这里知识粗略提一下,具体的在Duilib源码分析系列再具体说明)
实际上,经过上述操作后就已经可以显示出界面效果了。但这里,对第二步中关于XML文件的加载额外补充说明一下。
CPaintManagerUI::窗口消息及图形绘制管理器类。
CDialogBuilder: 创建控件类,分析脚本并用递归方式(_Parse函数)创建所有控件实例。
在m_pm.AttachDialog操作中,duilib中内部处理:
-> InitControls (初始化控件)-> FindControl-> __FindControlFromNameHash->pManager->m_mNameHash.Insert(把控件插入到Hash中)
至此,界面已经可以显示出来了,而如何进行事件处理、消息响应呢?在 Duilib学习笔记《05》中再具体说明…