Duilib学习笔记《04》— 窗体显示
在前面已經(jīng)了解了duilib控件以及界面布局相關內容,接下來就要考慮該如何將xml中描述的布局通過界面展現(xiàn)出來。實際上在?Duilib學習筆記《01》?中我們已經(jīng)簡單提到過基本的流程及元素創(chuàng)建機制。這里我們直接用?Duilib學習筆記《03》最后提供的代碼,下面我們就具體來說明:
一.?duilib調用設置
#include "..\DuiLib\UIlib.h" using namespace DuiLib; #ifdef _DEBUG # ifdef _UNICODE # pragma comment(lib, "..\\bin\\DuiLib_ud.lib") # else # pragma comment(lib, "..\\bin\\DuiLib_d.lib") # endif #else # ifdef _UNICODE # pragma comment(lib, "..\\bin\\DuiLib_u.lib") # else # pragma comment(lib, "..\\bin\\DuiLib.lib") # endif #endif在工程中的stdafx.h頭文件中添加上述代碼。當然,也并不一定非要在stdafx.h文件中添加,根據(jù)自己工程的實際情況進行設置即可。
二. 窗體類
在duilib中,所有的窗口均繼承自CWindowWnd類,在CWindowWnd類中由虛函數(shù)HandleMessage來處理Windows消息(如WM_CREATE、WM_SIZE等等),所以對于本例的窗體類,同樣需要繼承CWinowWnd,同時窗體類中需要重寫虛函數(shù)HandleMessage用于Windows消息的處理。
而對于duilib,我們此時更關心是界面元素是如何創(chuàng)建顯示出來的。實際上,在Create創(chuàng)建窗體類時會觸發(fā)WM_CREATE消息,這個消息也就都由窗體類中的HandleMessage函數(shù)來處理,具體可查看示例代碼窗體類中該函數(shù)。WM_CREATE消息對應的消息處理函數(shù)OnCreate:
LRESULT CMainWndDlg::OnCreate( UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled ) {m_PaintManager.Init(m_hWnd); // 窗口類與窗口句柄關聯(lián) CDialogBuilder builder;CControlUI* pRoot = builder.Create(_T("DemoSkin.xml"), (UINT)0, NULL, &m_PaintManager); // 核心:加載XML并動態(tài)創(chuàng)建界面元素ASSERT(pRoot && "Failed to parse XML");m_PaintManager.AttachDialog(pRoot); // 附加控件數(shù)據(jù)到HASH表中return 0; }在窗體類的OnCreate函數(shù)中加載窗體對應的XML布局文件并動態(tài)創(chuàng)建界面元素。
三. 入口函數(shù)——初始化并創(chuàng)建顯示窗口類
int APIENTRY _tWinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPTSTR lpCmdLine,int nCmdShow) {CPaintManagerUI::SetInstance(hInstance); // 實例句柄與渲染類關聯(lián)CPaintManagerUI::SetResourcePath(CPaintManagerUI::GetInstancePath()); // 指定資源路徑 HRESULT Hr = ::CoInitialize(NULL); // 初始化COM庫, 為加載COM庫提供支持if( FAILED(Hr) ) return 0;CMainWndDlg* pMainDlg = new CMainWndDlg(); // 創(chuàng)建窗口類pMainDlg->Create(NULL, _T("Demo窗體"), UI_WNDSTYLE_FRAME, WS_EX_WINDOWEDGE); // 注冊窗口類與創(chuàng)建窗口 pMainDlg->CenterWindow(); // 窗口居中顯示pMainDlg->ShowModal();CPaintManagerUI::MessageLoop(); // 處理消息循環(huán)::CoUninitialize(); // 退出程序并釋放COM庫return 0; }在入口函數(shù)中設置相關初始化,然后創(chuàng)建窗口,這樣一來,編譯運行即可顯示對應的窗口。
四. 額外說明:XML加載
(注:這里知識粗略提一下,具體的在Duilib源碼分析系列再具體說明)
實際上,經(jīng)過上述操作后就已經(jīng)可以顯示出界面效果了。但這里,對第二步中關于XML文件的加載額外補充說明一下。
CPaintManagerUI::窗口消息及圖形繪制管理器類。 CDialogBuilder: 創(chuàng)建控件類,分析腳本并用遞歸方式(_Parse函數(shù))創(chuàng)建所有控件實例。在m_pm.AttachDialog操作中,duilib中內部處理:
-> InitControls?(初始化控件)->?FindControl->?__FindControlFromNameHash->pManager->m_mNameHash.Insert(把控件插入到Hash中)至此,界面已經(jīng)可以顯示出來了,而如何進行事件處理、消息響應呢?在?Duilib學習筆記《05》中再具體說明…
?
轉載于:https://www.cnblogs.com/MrYuan/p/4971999.html
總結
以上是生活随笔為你收集整理的Duilib学习笔记《04》— 窗体显示的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 博客园中的源代码格式显示
- 下一篇: 其他运算符