网上找到Duilib入门教程中,第一个给的时基于SDK的例子,在这里,自己写了个MFC的,与入门教程中的例子一样。
新建一个窗口类(CTestDlg)
TestDlg.h内容如下:
- #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;
- };
#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内容如下:
- #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);
- }
#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);
}
然后,在主对话框的类中,增加一个成员变量
- CTestDlg m_testDlg;
CTestDlg m_testDlg;
在OnInitDialog函数中,增加如下两行代码:
- m_testDlg.Create(*this, NULL, UI_WNDSTYLE_CHILD, 0, 0, 0, 642, 520);
- 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文件。内容如下:
- <?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>
<?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消息改成如下内容:
- 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);
- }
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);
}
编译运行即可。