天天看點

duilib基本流程

duilib基本流程

duilib的基本流程如上圖,通過解析一個xml檔案,将檔案中的内容渲染為視窗界面,這個解析過程由WindowImplBase類來完成。

基本架構如下:

1. 首先在公共頭檔案中加入如下内容:

#include 
#include 

using namespace DuiLib;

#ifdef _DEBUG
#pragma comment(lib, "DuiLib_ud.lib");
#else
#pragma comment(lib, "DuiLib_d.lib");
#endif      

這個是duilib的一些基本配置

2. 從WindowImplBase類中派生一個類,然後實作這樣3個基本函數:

virtual CDuiString GetSkinFolder() { return _T("skin"); };
    virtual CDuiString GetSkinFile()  { return _T("HelloWnd.xml"); };
    virtual LPCTSTR GetWindowClassName(void) const { return _T("HelloWnd"); };      

這三個函數的說明如下:

1、 GetSkinFolder () 需要傳回 皮膚XML 所在的檔案夾

2、GetSkinFile () 需要傳回 皮膚 XML 的檔案名(也可以包含路徑)

3、GetWindowClassName () 需要傳回這個視窗的類名,這個類名用于 RegisterClass.

這三個函數告知duilib庫應該從哪個檔案夾下解析哪個xml檔案,并定義對應視窗的名字,以後這個類就代表這個xml檔案所描述的視窗

需要注意的是這些函數必須在頭檔案中這樣寫,我自己寫在CPP檔案中它在運作時報錯,可能是庫本身的bug

3. 在WinMain主函數中添加如下代碼

int APIENTRY _tWinMain(_In_ HINSTANCE hInstance,
                     _In_opt_ HINSTANCE hPrevInstance,
                     _In_ LPTSTR    lpCmdLine,
                     _In_ int       nCmdShow)
{
    CPaintManagerUI::SetInstance(hInstance);// 加載XML的時候,需要使用該句柄去定位EXE的路徑,才能加載XML的路徑
    CHelloWnd* wnd = new CHelloWnd; // 生成對象
    wnd->Create(NULL, NULL, UI_WNDSTYLE_DIALOG, 0); // 建立DLG視窗
    wnd->CenterWindow(); // 視窗居中
//  wnd->ShowWindow();//作為非模态對話框顯示
    wnd->ShowModal(); // 顯示
//  CPaintManagerUI::MessageLoop(); // 消息循環,是一個預設的消息循環,什麼消息都不響應

    delete wnd; // 删除對象

    return 0;
}      

在這建立了一個對話框,但是如果加上消息循環就表示它是一個非模态對話框,這個視窗我沒有給它菜單欄,也就沒有關閉按鈕,如果作為非模态對話框,要加上一句CPaintManagerUI::MessageLoop();給它一個消息循環。但是它将不能關閉,隻能通過任務管理器強制結束,使用ShowModal表示将它作為模态對話框,在win32中模态對話框使用它自己的消息循環,也就不需要自己給它一個消息循環,它可以在工作列上被關閉。

類的Create函數定義如下:

HWND Create(HWND hwndParent, LPCTSTR pstrName, DWORD dwStyle, DWORD dwExStyle, int x = CW_USEDEFAULT, int y = CW_USEDEFAULT, int cx = CW_USEDEFAULT, int cy = CW_USEDEFAULT, HMENU hMenu = NULL);      
#define UI_WNDSTYLE_CONTAINER  (0)
#define UI_WNDSTYLE_FRAME      (WS_VISIBLE | WS_OVERLAPPEDWINDOW)
#define UI_WNDSTYLE_CHILD      (WS_VISIBLE | WS_CHILD | WS_CLIPSIBLINGS | WS_CLIPCHILDREN)
#define UI_WNDSTYLE_DIALOG     (WS_VISIBLE | WS_POPUPWINDOW | WS_CAPTION | WS_DLGFRAME | WS_CLIPSIBLINGS | WS_CLIPCHILDREN)

//下面是視窗的擴充類型
#define UI_WNDSTYLE_EX_FRAME   (WS_EX_WINDOWEDGE)
#define UI_WNDSTYLE_EX_DIALOG  (WS_EX_TOOLWINDOW | WS_EX_DLGMODALFRAME)
//下面是視窗類類型
#define UI_CLASSSTYLE_CONTAINER  (0)
#define UI_CLASSSTYLE_FRAME      (CS_VREDRAW | CS_HREDRAW)
#define UI_CLASSSTYLE_CHILD      (CS_VREDRAW | CS_HREDRAW | CS_DBLCLKS | CS_SAVEBITS)
#define UI_CLASSSTYLE_DIALOG     (CS_VREDRAW | CS_HREDRAW | CS_DBLCLKS | CS_SAVEBITS)      
下一篇: IO庫