2021 Duilib最新入門教程(五)Duilib調用靜態庫示例


目錄

原理

  靜態庫文件后綴名是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


免責聲明!

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



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