duilib——从XML文件中加载界面

Duilib支持xml界面布局文件,使得界面设计与逻辑处理相分离。
需要以下几个步骤:
1、创建并初始化CPaintManagerUI对象。
2、创建CDialogBuilder对象,调用CDialogBuilder对象的Create函数加载xml界面布局文件,该函数返回界面元素根节点。使用UIDesigner工具编写xml界面布局文件。
3、调用CPaintManagerUI的AttachDialog將界面元素根节点附加到CPaintManagerUI对象中。
实例:

//Helloworld.h

 

#pragma once

#include "resource.h"

#include "COMUTIL.H"
#include <UIlib.h>
using namespace DuiLib;

#ifdef _DEBUG
#   ifdef _UNICODE
#       pragma comment(lib, "DuiLib_ud.lib")
#   else
#       pragma comment(lib, "DuiLib_d.lib")
#   endif
#else
#   ifdef _UNICODE
#       pragma comment(lib, "DuiLib_u.lib")
#   else
#       pragma comment(lib, "DuiLib.lib")
#   endif
#endif

 

 

 

//Helloworld.cpp

 

#include "Helloworld.h"

class CDuiFrameWnd : public CWindowWnd, public INotifyUI
{
public:
	CDuiFrameWnd()
	{
		m_pRoot = NULL;
		m_pHelloBtn = NULL;
	};
	virtual LPCTSTR GetWindowClassName() const { return _T("DUIMainFrame"); }
	UINT GetClassStyle() const { return UI_CLASSSTYLE_FRAME | CS_DBLCLKS; };
	void OnFinalMessage(HWND /*hWnd*/) { delete this; };

	virtual void    Notify(TNotifyUI & msg) 
	{
		if(msg.sType == _T("click"))
		{
			if (msg.pSender->GetName() == _T("btnHello"))
			{
				::MessageBox(NULL, _T("我是按钮"), _T("点击了按钮"), NULL);
			}
		}
	}

	virtual LRESULT HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)
	{
		LRESULT lRes = 0;

		if( uMsg == WM_CREATE ) 
		{
			m_PaintManager.Init(m_hWnd); 
			//从xml中加载界面
			CDialogBuilder builder;
			m_pRoot = builder.Create("main.xml",(UINT)0,NULL,&m_PaintManager);
			m_PaintManager.AttachDialog(m_pRoot); 
			m_PaintManager.AddNotifier(this);				//添加控件等消息响应,这样消息就会传达到duilib的消息循环
			m_pHelloBtn = m_PaintManager.FindControl(_T("btnHello"));
			if(m_pHelloBtn != NULL)
			{
				m_pHelloBtn->SetBorderSize(10);
				m_pHelloBtn->SetBkColor(0xff00ff00);
			}

			return lRes;
		}
		else if(uMsg == WM_PAINT)
		{

		}
		else if( uMsg == WM_DESTROY ) {
			::PostQuitMessage(0L);
		}
		else if( uMsg == WM_ERASEBKGND ) {
			return 1;
		}

		lRes = 0;
		if(m_PaintManager.MessageHandler(uMsg, wParam, lParam, lRes) ) 
			return lRes;

		return CWindowWnd::HandleMessage(uMsg, wParam, lParam);
	}

protected:
	CPaintManagerUI m_PaintManager;
	CControlUI *m_pHelloBtn;
	CControlUI *m_pRoot;
};


int APIENTRY _tWinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR    lpCmdLine,
                     int       nCmdShow)
{
	CPaintManagerUI::SetInstance(hInstance);
	CPaintManagerUI::SetResourcePath(CPaintManagerUI::GetInstancePath());
	HRESULT Hr = ::CoInitialize(NULL);
	if(FAILED(Hr)) 
		return 0;

	CDuiFrameWnd* pFrame = new CDuiFrameWnd();
	if( pFrame == NULL ) 
		return 0;

	pFrame->Create(NULL, _T("简单测试demo-2"), UI_WNDSTYLE_FRAME, WS_EX_WINDOWEDGE);
	pFrame->CenterWindow();
	pFrame->ShowWindow(true);
	CPaintManagerUI::MessageLoop();
	::CoUninitialize();
	return 0;
}

 

 

 

使用Duilib加载XML文件需要经过以下几个简单的步骤: 1. 在项目添加Duilib库的头文件和库文件。 2. 在代码创建窗口类,并在窗口类的构造函数使用CDuiXMLBuilder类加载XML文件。 3. 在窗口类实现消息处理函数。 具体的步骤如下: 1. 在项目添加Duilib库的头文件和库文件。 ```cpp #include "UIlib.h" // 添加Duilib库的链接库文件 #pragma comment(lib, "DuiLib.lib") ``` 2. 在代码创建窗口类,并在窗口类的构造函数使用CDuiXMLBuilder类加载XML文件。 ```cpp class CMyWnd : public WindowImplBase { public: CMyWnd() { // 使用CDuiXMLBuilder类加载XML文件 CDuiXMLBuilder builder; CControlUI* pRoot = builder.Create(L"my.xml", (UINT)0, NULL, &m_pm); if (pRoot) { // 将加载的UI控件树作为窗口的根控件 this->Add(pRoot); } } virtual LPCTSTR GetWindowClassName() const { return _T("MyWnd"); } virtual void OnFinalMessage(HWND hWnd) { delete this; } virtual LRESULT OnClose(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { bHandled = TRUE; ::PostQuitMessage(0); return 0; } } ``` 3. 在窗口类实现消息处理函数。 ```cpp class CMyWnd : public WindowImplBase { public: // ... virtual CDuiString GetSkinFile() { return _T("my.xml"); } virtual LPCTSTR GetWindowClassName() const { return _T("MyWnd"); } virtual void OnFinalMessage(HWND hWnd) { delete this; } virtual LRESULT OnClose(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { bHandled = TRUE; ::PostQuitMessage(0); return 0; } } ``` 以上是使用Duilib加载XML文件的基本步骤,具体的实现还需要根据实际情况进行调整。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

byxdaz

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值