原理
靜態庫文件后綴名是lib,編譯的時候合並到軟件里面去。
調用靜態庫需要兩件套:1、頭文件2、靜態庫。
特殊的地方:調用Duilib的靜態庫時,需要先定義靜態宏(#define UILIB_STATIC)
步驟
1、新建項目,選擇“Windows 桌面應用程序”
2、項目名字定為DuilibMinDemoStatic
3、選擇“桌面應用程序”和“空項目”
4、添加Duilib頭文件所在的目錄
5、復制靜態庫DuiLib_Static_ud.lib到代碼目錄下
6、添加代碼文件main.cpp
#define UILIB_STATIC // 聲明靜態宏:UILIB_STATIC(必須在UIlib.h之前聲明)
#include "UIlib.h" // 引入頭文件:UIlib.h
using namespace DuiLib; // 使用命名空間:DuiLib
#pragma comment(lib, "DuiLib_Static_ud.lib") // 加載靜態庫:DuiLib_Static_ud.lib
//CWindowWnd:處理Window消息 INotifyUI:處理Duilib消息
class CDuilibWnd : public CWindowWnd, public INotifyUI
{
public:
virtual LPCTSTR GetWindowClassName() const { return _T("DuiWnd"); }
// 響應消息 重寫
virtual void Notify(TNotifyUI& msg) INotifyUI::Notify
{
//if (msg.sType == DUI_MSGTYPE_CLICK)
if (msg.sType == _T("click"))
{
if (msg.pSender->GetName() == _T("btn"))
{
::MessageBox(NULL, _T("按鈕內容"), _T("按鈕標題"), NULL);
}
}
}
// 重寫CWindowWnd::HandleMessage處理消息
virtual LRESULT HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)
{
LRESULT lRes = 0;
// 初始化窗口消息
if (uMsg == WM_CREATE)
{
// 初始化繪制管理器,m_hWnd句柄在一個消息WM_NCCREATE中賦值
m_PaintManager.Init(m_hWnd);
// 使用XML布局文件生成界面
CDialogBuilder builder;
CControlUI* pRoot = builder.Create(_T("duilib.xml"), 0, NULL, &m_PaintManager);
ASSERT(pRoot && "Failed to parse XML");
// 添加CControlUI對象,用於管理界面
m_PaintManager.AttachDialog(pRoot);
// 添加INotifyUI對象,用於處理消息
m_PaintManager.AddNotifier(this);
return lRes;
}
// CPaintManagerUI處理消息
if (m_PaintManager.MessageHandler(uMsg, wParam, lParam, lRes)) return lRes;
// CWindowWnd兜底處理消息
return __super::HandleMessage(uMsg, wParam, lParam);
}
protected:
CPaintManagerUI m_PaintManager; // 繪制管理器:負責繪制界面和管理消息
};
int APIENTRY _tWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPWSTR lpCmdLine, _In_ int nShowCmd )
{
// 繪制管理器CPaintManagerUI綁定窗口句柄
CPaintManagerUI::SetInstance(hInstance);
// 繪制管理器CPaintManagerUI設置資源目錄,用於加載XML
CPaintManagerUI::SetResourcePath(CPaintManagerUI::GetInstancePath());
// 創建窗口
CDuilibWnd duilibWnd;
duilibWnd.Create(NULL, _T("標題"), UI_WNDSTYLE_FRAME, WS_EX_WINDOWEDGE);
// 顯示窗口並且監聽消息
duilibWnd.ShowModal();
return 0;
}
7、編譯之后出現RuntimeLibrary不匹配問題
錯誤 LNK2038 檢測到“RuntimeLibrary”的不匹配項: 值“MTd_StaticDebug”不匹配值“MDd_DynamicDebug”(main.obj 中) DuilibMinDemoStatic G:\Duilib\DuilibMinDemoStatic\DuilibMinDemoStatic\DuiLib_Static_ud.lib(UIBase.obj) 1
8、修改運行庫為 MTd
9、這里就編譯成功了
10、在Debug目錄下加上界面文件duilib.xml
<?xml version="1.0" encoding="UTF-8"?>
<Window size="200,100">
<HorizontalLayout bkcolor="#FFFFFFFF">
<Button name="btn" text="按鈕" height="40" width="80" bordersize="1,1,1,1" bordercolor="#FFBCBCBC"/>
</HorizontalLayout>
</Window>
11、軟件運行效果
Duilib技術交流群:799142530
源碼地址:https://github.com/KongKong20/DuilibTutor