DuiLib 与 MFC的结合

网上找到Duilib入门教程中,第一个给的时基于SDK的例子,在这里,自己写了个MFC的,与入门教程中的例子一样。

新建一个窗口类(CTestDlg)

TestDlg.h内容如下:

  1. #pragma once   
  2. class CTestDlg:public CWindowWnd, INotifyUI  
  3. {  
  4. public:  
  5.     CTestDlg(void);  
  6.     ~CTestDlg(void);  
  7.       
  8. public:  
  9.     LPCTSTR GetWindowClassName() const;  
  10.     UINT GetClassStyle() const;  
  11.     void OnFinalMessage(HWND hWnd);  
  12.     void Notify(TNotifyUI& msg);  
  13.     LRESULT HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam);  
  14. private:  
  15.     CPaintManagerUI m_pm;  
  16. };  
#pragma once
class CTestDlg:public CWindowWnd, INotifyUI
{
public:
	CTestDlg(void);
	~CTestDlg(void);
	
public:
	LPCTSTR GetWindowClassName() const;
	UINT GetClassStyle() const;
	void OnFinalMessage(HWND hWnd);
	void Notify(TNotifyUI& msg);
	LRESULT HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam);
private:
	CPaintManagerUI m_pm;
};


TestDlg.cpp内容如下:

  1. #include "StdAfx.h"   
  2. #include "TestDlg.h"   
  3.   
  4.   
  5. CTestDlg::CTestDlg(void)  
  6. {  
  7. }  
  8.   
  9. CTestDlg::~CTestDlg(void)  
  10. {  
  11. }  
  12.   
  13. LPCTSTR CTestDlg::GetWindowClassName() const  
  14. {  
  15.     return L"CTestDlg";  
  16. }  
  17.   
  18. UINT CTestDlg::GetClassStyle() const  
  19. {  
  20.     return UI_CLASSSTYLE_FRAME | CS_DBLCLKS;  
  21. }  
  22.   
  23. void CTestDlg::OnFinalMessage(HWND hWnd)  
  24. {  
  25. }  
  26.   
  27. void CTestDlg::Notify(TNotifyUI& msg)  
  28. {  
  29.     if( msg.sType == _T("click") ) {  
  30.         if( msg.pSender->GetName() == _T("closebtn") ) {  
  31.             Close();  
  32.         }  
  33.     }  
  34. }  
  35.   
  36. LRESULT CTestDlg::HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)  
  37. {  
  38.     if( uMsg == WM_CREATE ) {  
  39.         m_pm.Init(m_hWnd);  
  40.         CControlUI *pButton = new CButtonUI;  
  41.         pButton->SetName(_T("closebtn"));  
  42.         pButton->SetBkColor(0xFFFF0000);  
  43.         m_pm.AttachDialog(pButton);  
  44.         m_pm.AddNotifier(this);  
  45.         return 0;  
  46.     }  
  47.     else if( uMsg == WM_DESTROY ) {  
  48.         ::PostQuitMessage(0);  
  49.     }  
  50.     LRESULT lRes = 0;  
  51.     if( m_pm.MessageHandler(uMsg, wParam, lParam, lRes) ) return lRes;  
  52.     return CWindowWnd::HandleMessage(uMsg, wParam, lParam);  
  53.   
  54. }  
#include "StdAfx.h"
#include "TestDlg.h"


CTestDlg::CTestDlg(void)
{
}

CTestDlg::~CTestDlg(void)
{
}

LPCTSTR CTestDlg::GetWindowClassName() const
{
	return L"CTestDlg";
}

UINT CTestDlg::GetClassStyle() const
{
	return UI_CLASSSTYLE_FRAME | CS_DBLCLKS;
}

void CTestDlg::OnFinalMessage(HWND hWnd)
{
}

void CTestDlg::Notify(TNotifyUI& msg)
{
	if( msg.sType == _T("click") ) {
		if( msg.pSender->GetName() == _T("closebtn") ) {
			Close();
		}
	}
}

LRESULT CTestDlg::HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	if( uMsg == WM_CREATE ) {
		m_pm.Init(m_hWnd);
		CControlUI *pButton = new CButtonUI;
		pButton->SetName(_T("closebtn"));
		pButton->SetBkColor(0xFFFF0000);
		m_pm.AttachDialog(pButton);
		m_pm.AddNotifier(this);
		return 0;
	}
	else if( uMsg == WM_DESTROY ) {
		::PostQuitMessage(0);
	}
	LRESULT lRes = 0;
	if( m_pm.MessageHandler(uMsg, wParam, lParam, lRes) ) return lRes;
	return CWindowWnd::HandleMessage(uMsg, wParam, lParam);

}


然后,在主对话框的类中,增加一个成员变量

  1. CTestDlg m_testDlg;  
CTestDlg m_testDlg;


在OnInitDialog函数中,增加如下两行代码:

  1. m_testDlg.Create(*this, NULL, UI_WNDSTYLE_CHILD, 0, 0, 0, 642, 520);  
  2. m_testDlg.ShowWindow(TRUE);  
	m_testDlg.Create(*this, NULL, UI_WNDSTYLE_CHILD, 0, 0, 0, 642, 520);
	m_testDlg.ShowWindow(TRUE);


编译运行,即可。

 

 

//=============================================华丽的分割线================================================//

在上一篇文章"MFC中使用Duilib--1"中, 没有用到资源文件,即xml,本篇讲怎样加载文件。

1.  在exe输出目录下,创建一个skin目录,里面放入需要用到的图片文件,以及创建一个或几个xml文件,在这里,我创建一个skin.xml文件。内容如下:

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <Window mininfo="200,360" size=" 480,320 ">  
  3.     <Default name="Button" value="normalimage="file='skin\button_nor.bmp' corner='4,2,4,2' fade='200' hsl='true'" hotimage="file='skin\button_over.bmp' corner='4,2,4,2' fade='200' hsl='true'" pushedimage="file='skin\button_down.bmp' corner='4,2,4,2' fade='200' hsl='true' " " />  
  4.         <Font name="幼圆" size="16" default="true" />  
  5.         <VerticalLayout bkcolor="#FFFF00FF">  
  6.             <Button name="changeskinbtn" height="20" text="测试按钮" maxwidth="120"/>  
  7.             <RichEdit name="testrichedit" bordercolor="#FF0000" bordersize="0" borderround="18,18" inset="4,2,4,2" bkcolor="#FFF2F5FA" bkcolor2="#FFA0A000" bkcolor3="#FFF2F5FA" font="1" multiline="true" vscrollbar="true" autovscroll="true" enabled="true" rich="true" readonly="false" text="测试richedit">  
  8.             </RichEdit>  
  9.             <Edit name="testedit" text="测试编辑框" />  
  10.         </VerticalLayout>  
  11. </Window>  
<?xml version="1.0" encoding="UTF-8"?>
<Window mininfo="200,360" size=" 480,320 ">
	<Default name="Button" value="normalimage="file='skin\button_nor.bmp' corner='4,2,4,2' fade='200' hsl='true'" hotimage="file='skin\button_over.bmp' corner='4,2,4,2' fade='200' hsl='true'" pushedimage="file='skin\button_down.bmp' corner='4,2,4,2' fade='200' hsl='true' " " />
		<Font name="幼圆" size="16" default="true" />
		<VerticalLayout bkcolor="#FFFF00FF">
			<Button name="changeskinbtn" height="20" text="测试按钮" maxwidth="120"/>
			<RichEdit name="testrichedit" bordercolor="#FF0000" bordersize="0" borderround="18,18" inset="4,2,4,2" bkcolor="#FFF2F5FA" bkcolor2="#FFA0A000" bkcolor3="#FFF2F5FA" font="1" multiline="true" vscrollbar="true" autovscroll="true" enabled="true" rich="true" readonly="false" text="测试richedit">
			</RichEdit>
			<Edit name="testedit" text="测试编辑框" />
		</VerticalLayout>
</Window>


需要用到的资源图片有button_nor.bmp、button_over.bmp、button_down.bmp。

 

再将上节内容中的CTestDlg的HandleMessage函数中的WM_CREATE消息改成如下内容:

  1. LRESULT CTestDlg::HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)  
  2. {  
  3.     if( uMsg == WM_CREATE ) {  
  4.         //m_pm.Init(m_hWnd);   
  5.         //CControlUI *pButton = new CButtonUI;   
  6.         //pButton->SetName(_T("closebtn"));   
  7.         //pButton->SetBkColor(0xFFFF0000);   
  8.         //m_pm.AttachDialog(pButton);   
  9.         //m_pm.AddNotifier(this);   
  10.         m_pm.Init(m_hWnd);  
  11.         CDialogBuilder builder;  
  12.         CControlUI *pRoot = builder.Create(L"skin\\skin.xml", (UINT)0, NULL, &m_pm);  
  13.         ASSERT(pRoot && "Failed to parse XML");  
  14.         m_pm.AttachDialog(pRoot);  
  15.         m_pm.AddNotifier(this);  
  16.         return 0;  
  17.     }  
  18.     else if( uMsg == WM_DESTROY ) {  
  19.         ::PostQuitMessage(0);  
  20.     }  
  21.     LRESULT lRes = 0;  
  22.     if( m_pm.MessageHandler(uMsg, wParam, lParam, lRes) ) return lRes;  
  23.     return CWindowWnd::HandleMessage(uMsg, wParam, lParam);  
  24.   
  25. }  
LRESULT CTestDlg::HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	if( uMsg == WM_CREATE ) {
		//m_pm.Init(m_hWnd);
		//CControlUI *pButton = new CButtonUI;
		//pButton->SetName(_T("closebtn"));
		//pButton->SetBkColor(0xFFFF0000);
		//m_pm.AttachDialog(pButton);
		//m_pm.AddNotifier(this);
		m_pm.Init(m_hWnd);
		CDialogBuilder builder;
		CControlUI *pRoot = builder.Create(L"skin\\skin.xml", (UINT)0, NULL, &m_pm);
		ASSERT(pRoot && "Failed to parse XML");
		m_pm.AttachDialog(pRoot);
		m_pm.AddNotifier(this);
		return 0;
	}
	else if( uMsg == WM_DESTROY ) {
		::PostQuitMessage(0);
	}
	LRESULT lRes = 0;
	if( m_pm.MessageHandler(uMsg, wParam, lParam, lRes) ) return lRes;
	return CWindowWnd::HandleMessage(uMsg, wParam, lParam);

}

编译运行即可。

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值