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


目錄

  先介紹下Duilib例子的相關原理,有個大概的認識,再列舉具體的步驟。

原理

  使用Duilib編寫一個界面軟件,本質上還是一個Win32的軟件,只不過這個軟件的界面不使用Windows自帶的控件,而是交給Duilib繪制界面。
  關於消息處理,底層還是處理Window消息,但Duilib會進一步轉化成Duilib消息,方便編寫響應的邏輯。
  
  基本流程:
    Win32的入口函數:_tWinMain
    Duilib生成界面:CDialogBuilder
    Duilib繪制界面:CPaintManagerUI
    處理Window消息:CWindowWnd
    處理Duilib消息: INotifyUI

  調用動態庫需要三件套:
    1、頭文件
    2、導入庫
    3、動態庫

步驟

  
1、創建新項目

  
2、選擇Windows桌面向導

  
3、設置項目名字

  
4、勾上空項目,選擇桌面應用程序

  
5、引入Duilib的頭文件和導入庫


  
6、復制Duilib的動態庫
  從duilib-master\bin目錄中復制動態庫文件到DuilibMinDemo\DuilibMinDemo目錄
  動態庫文件包括:DuiLib.dll、DuiLib_d.dll、DuiLib_u.dll、DuiLib_ud.dll

  
7、添加main.cpp

  
8、編寫代碼

#include "UIlib.h"                      // 引入頭文件:UIlib.h
using namespace DuiLib;                 // 使用命名空間:DuiLib
#pragma comment(lib, "DuiLib_ud.lib")   // 加載導入庫:DuiLib_ud.lib
//CWindowWnd:處理Window消息 INotifyUI:處理Duilib消息
class CDuilibWnd : public CWindowWnd, public INotifyUI  
{
public:
	virtual LPCTSTR GetWindowClassName() const { return _T("DuiWnd"); }
	// 響應消息 重寫INotifyUI::Notify
	virtual void Notify(TNotifyUI& msg) 
	{
		//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;
}

  
9、添加界面文件
  DuilibMinDemo\Debug 加上界面文件:duilib.xml

<?xml version="1.0" encoding="UTF-8"?>
<Window size="240,100">
    <HorizontalLayout bkcolor="#FFFFFFFF">
		<Button name="btn" text="按鈕" height="40" width="80" bordersize="1,1,1,1" bordercolor="#FFBCBCBC"/>
    </HorizontalLayout>
</Window>

  
10、運行效果

  
Duilib技術交流群:799142530
源碼地址:https://github.com/KongKong20/DuilibTutor


免責聲明!

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



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