标签:
因为公司项目最近入了MFC的这个大坑,用MFC做UI做了一段时间,感觉不是很方便,开发效率有点慢。
看了c++里面做界面的类库,感觉Duilib比较符合做界面的需求,而且很多大公司也在使用Duilib,那就随一下大流,并在此表达对Duilib作者及广大的开源作者的敬意。
Duilib支持win32程序及MFC程序。
?
步骤如下:
?
可以去https://github.com/duilib/duilib下载框架,将Duilib框架在UnicodeDebug及Debug下编译生成库文件
下面都是VS2008的环境操作。在VC++ 选项->项目与解决方案-> VC++目录
引入Duilib的
包含文件
库文件
源文件
设置系统的环境变量
不设置环境变量的话,也可以直接把DuiLib_ud.dll及DuiLib_d.dll复制到应用程序的生成目录。否则会报缺少相关dll的错误。
?
在stdafx.h文件中加入duilib的头文件及库
#include <ObjBase.h>
#include <UIlib.h>
?
using namespace DuiLib;
?
#ifdef _DEBUG
#pragma comment (lib, "duilib_ud.lib")
#else
#pragma comment (lib, "duilib_u.lib")
#endif
?
注意:如果将生成的程序拿到其他机器上运行,一定要复制DuiLib_ud.dll及DuiLib_d.dll到应用程序的根目录。
?
?
创建一个C++类,让这个类继承Duilib的CWindowWnd和INotifyUI
如下所示:
?
在自己定义的类的头文件中加上
public:
LPCTSTR GetWindowClassName() const;
void????Notify(TNotifyUI& msg);
LRESULT HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam);
?
及
private:
????CPaintManagerUI m_pm;
?
?
GetWindowClassName是设置类的类名称
?
源文件可以如下定义:
LPCTSTR CDuiLib_Dialog::GetWindowClassName() const
{
????return (LPCTSTR)"CTestDlg"; /*自己可以随意取个名字*/
}
?
?
Notify是Duilib中控件的响应函数,比如说某个控件按钮点击之后的处理。
源文件可以如下定义:
void CDuiLib_Dialog::Notify(TNotifyUI& msg)
{
????if( msg.sType == _T("click") )
????{
????????if( msg.pSender->GetName() == _T("closebtn") )
????????{
????????????Close();
????????}
????}
}
?
?
?
HandleMessage是Duilib中对消息循环的消息处理函数。
可以在这个函数中对Duilib进行初始化
源文件可以如下定义:
LRESULT CDuiLib_Dialog::HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)
{
????if( uMsg == WM_CREATE )
????{
?
????????CPaintManagerUI::SetInstance(AfxGetInstanceHandle());//加载XML的时候,需要使用该句柄去定位EXE的路径,才能加载XML的路径
????????CPaintManagerUI::SetResourcePath(CPaintManagerUI::GetInstancePath() + _T("skin"));//定位图片等资源的位置
?
????????m_pm.Init(m_hWnd);
????????CDialogBuilder builder;
????????CControlUI *pRoot = builder.Create(_T("MainActivity.xml"), (UINT)0, NULL, &m_pm); //加载的XML文件的名称
????????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);
?
}
?
?
?
在主窗体中创建这个Duilib,
?
在主窗体的这个类中加一个刚才增加的类对象 m_dlgDuilib(对象名随意)
通过下面代码创建
????if(m_dlgDuilib == NULL)
????{
????????m_dlgDuilib.Create(this->m_hWnd, NULL, UI_WNDSTYLE_DIALOG & (~( WS_BORDER | WS_CAPTION )) , 0, 0, 0, 800, 600);
????}
????m_dlgDuilib.CenterWindow();
????m_dlgDuilib.ShowWindow(TRUE);
可以设置打开的窗体样式为
UI_WNDSTYLE_DIALOG & (~(WS_CAPTION | WS_BORDER))
?
?
Duilib的窗体布局是通过xml来体现的,在Duilib中有一个Dui Designer,可以通过其进行设计。关于Duilib的使用可以查看这篇文章:http://www.cnblogs.com/lin1270/p/4106944.html
?
Demo下载地址:http://pan.baidu.com/s/1mgHv74G
标签:
原文地址:http://www.cnblogs.com/poissonnotes/p/4435588.html