Duilib 原始碼分析(一)示例推演

2022-06-10 08:15:07 字數 3125 閱讀 3117

duilib示範例子

使用duilib編寫乙個介面軟體,本質上還是乙個win32的軟體,只不過這個軟體的介面不使用windows自帶的控制項,而是交給duilib繪製介面。

關於訊息處理,底層還是處理window訊息,但duilib會進一步轉化成duilib訊息,方便編寫響應的邏輯。

最簡單的win32程式如下:

#include int apientry _twinmain(

_in_ hinstance hinstance,

_in_opt_ hinstance hprevinstance,

_in_ lpwstr lpcmdline,

_in_ int nshowcmd)

載入duilib動態庫

#include "uilib.h"                      // 引入標頭檔案:uilib.h

using namespace duilib; // 使用命名空間:duilib

#pragma comment(lib, "duilib_ud.lib") // 載入導入庫:duilib_ud.lib

int apientry _twinmain(

_in_ hinstance hinstance,

_in_opt_ hinstance hprevinstance,

_in_ lpwstr lpcmdline,

_in_ int nshowcmd)

帶介面的軟體,可以分成兩大模組:介面顯示和訊息處理

duilib中的cpaintmanagerui負責管理介面和訊息

duilib中的cwindowwnd負責處理window訊息

duilib中的inotifyui負責處理duilib訊息

#include "uilib.h"                      // 引入標頭檔案:uilib.h

using namespace duilib; // 使用命名空間:duilib

#pragma comment(lib, "duilib_ud.lib") // 載入導入庫:duilib_ud.lib

class cduilibwnd :public cwindowwnd, public inotifyui

int apientry _twinmain(

_in_ hinstance hinstance,

_in_opt_ hinstance hprevinstance,

_in_ lpwstr lpcmdline,

_in_ int nshowcmd)

繪製管理器初始化

#include "uilib.h"                      // 引入標頭檔案:uilib.h

using namespace duilib; // 使用命名空間:duilib

#pragma comment(lib, "duilib_ud.lib") // 載入導入庫:duilib_ud.lib

class cduilibwnd :public cwindowwnd, public inotifyui

int apientry _twinmain(

_in_ hinstance hinstance,

_in_opt_ hinstance hprevinstance,

_in_ lpwstr lpcmdline,

_in_ int nshowcmd)

建立並顯示介面

#include "uilib.h"                      // 引入標頭檔案:uilib.h

using namespace duilib; // 使用命名空間:duilib

#pragma comment(lib, "duilib_ud.lib") // 載入導入庫:duilib_ud.lib

class cduilibwnd :public cwindowwnd, public inotifyui

int apientry _twinmain(

_in_ hinstance hinstance,

_in_opt_ hinstance hprevinstance,

_in_ lpwstr lpcmdline,

_in_ int nshowcmd)

處理window訊息

lresult handlemessage(uint umsg, wparam wparam, lparam lparam)

// cpaintmanagerui處理訊息

if (m_paintmanager.messagehandler(umsg, wparam, lparam, lres)) return lres;

// cwindowwnd兜底處理訊息

return __super::handlemessage(umsg, wparam, lparam);

}

處理duilib訊息

void notify(tnotifyui& msg)

}}

其中生成介面的邏輯**

cpaintmanagerui m_paintmanager;

cdialogbuilder builder;

ccontrolui* proot = builder.create(_t("duilib.xml"), 0, null, &m_paintmanager);

m_paintmanager.attachdialog(proot);

小結duilib只是個介面庫,軟體本質還是win32軟體,只不過介面的繪製交給duilib中的cpaintmanagerui負責處理,而解析介面xml檔案的是cdialogbuilder 。軟體的訊息交給cwindowwnd和inotifyui處理。

duilib技術***:799142530

Duilib 原始碼分析之字型篇

在 duilib 中,我們可以定義多種字型,不同的控制項使用不同的字型來豐富我們的介面,今天我們來介紹一下 duilib 是如何使用字型的。首先,duilib 中定義字型的方法如下 name microsoft yahei size 12 bold false italic false defaul...

Duilib 原始碼分析(四)控制項繪製

渲染引擎crenderengine 封裝gdi duilib master duilib core uirender.h class duilib api crenderengine duilib master duilib core uirender.cpp void crenderengine ...

TAILQ 原始碼分析 用法示例

這其實是 1994 年的老 在 sys queue.h 中 queue.h 8.5 berkeley 8 20 94 一共提供了5個資料結構的封裝 1.單鏈表 list slist 省記憶體,少刪除,少插入 2.雙向列表 list list,可惜只能頭部插入,3.單佇列 queue 可頭尾插入。頭尾...