Duilib學習筆記《04》— 窗體顯示


在前面已經了解了duilib控件以及界面布局相關內容,接下來就要考慮該如何將xml中描述的布局通過界面展現出來。實際上在 Duilib學習筆記《01》 中我們已經簡單提到過基本的流程及元素創建機制。這里我們直接用 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文件中添加,根據自己工程的實際情況進行設置即可。

 

二. 窗體類

在duilib中,所有的窗口均繼承自CWindowWnd類,在CWindowWnd類中由虛函數HandleMessage來處理Windows消息(如WM_CREATE、WM_SIZE等等),所以對於本例的窗體類,同樣需要繼承CWinowWnd,同時窗體類中需要重寫虛函數HandleMessage用於Windows消息的處理。

而對於duilib,我們此時更關心是界面元素是如何創建顯示出來的。實際上,在Create創建窗體類時會觸發WM_CREATE消息,這個消息也就都由窗體類中的HandleMessage函數來處理,具體可查看示例代碼窗體類中該函數。WM_CREATE消息對應的消息處理函數OnCreate:

LRESULT CMainWndDlg::OnCreate( UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled )
{
    m_PaintManager.Init(m_hWnd);    // 窗口類與窗口句柄關聯
    CDialogBuilder builder;
    CControlUI* pRoot = builder.Create(_T("DemoSkin.xml"), (UINT)0, NULL, &m_PaintManager);  // 核心:加載XML並動態創建界面元素
    ASSERT(pRoot && "Failed to parse XML");
    m_PaintManager.AttachDialog(pRoot);    // 附加控件數據到HASH表中
    return 0;
}

在窗體類的OnCreate函數中加載窗體對應的XML布局文件並動態創建界面元素。

 

三. 入口函數——初始化並創建顯示窗口類

int APIENTRY _tWinMain(HINSTANCE hInstance,
                       HINSTANCE hPrevInstance,
                       LPTSTR    lpCmdLine,
                       int       nCmdShow)
{
    CPaintManagerUI::SetInstance(hInstance);    // 實例句柄與渲染類關聯
    CPaintManagerUI::SetResourcePath(CPaintManagerUI::GetInstancePath()); // 指定資源路徑

    HRESULT Hr = ::CoInitialize(NULL);    // 初始化COM庫, 為加載COM庫提供支持
    if( FAILED(Hr) ) return 0;

    CMainWndDlg* pMainDlg = new CMainWndDlg();    // 創建窗口類
    pMainDlg->Create(NULL, _T("Demo窗體"), UI_WNDSTYLE_FRAME, WS_EX_WINDOWEDGE);      // 注冊窗口類與創建窗口 
    pMainDlg->CenterWindow();    // 窗口居中顯示
    pMainDlg->ShowModal();
    CPaintManagerUI::MessageLoop();    // 處理消息循環
    ::CoUninitialize(); // 退出程序並釋放COM庫

    return 0;
}

在入口函數中設置相關初始化,然后創建窗口,這樣一來,編譯運行即可顯示對應的窗口。

 

四. 額外說明:XML加載

:這里知識粗略提一下,具體的在Duilib源碼分析系列再具體說明)

實際上,經過上述操作后就已經可以顯示出界面效果了。但這里,對第二步中關於XML文件的加載額外補充說明一下。

CPaintManagerUI::窗口消息及圖形繪制管理器類。
CDialogBuilder: 創建控件類,分析腳本並用遞歸方式(_Parse函數)創建所有控件實例。

在m_pm.AttachDialog操作中,duilib中內部處理:

-> InitControls (初始化控件)-> FindControl-> __FindControlFromNameHash->pManager->m_mNameHash.Insert(把控件插入到Hash中)
 

至此,界面已經可以顯示出來了,而如何進行事件處理、消息響應呢?在 Duilib學習筆記《05》中再具體說明…

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM