MFC中混合使用Duilib制作界面

因为公司项目最近入了MFC的这个大坑,用MFC做UI做了一段时间,感觉不是很方便,开发效率有点慢。

看了c++里面做界面的类库,感觉Duilib比较符合做界面的需求,而且很多大公司也在使用Duilib,那就随一下大流,并在此表达对Duilib作者及广大的开源作者的敬意。

Duilib支持win32程序及MFC程序。

 

步骤如下:

 

  1. 设置Duilib环境

可以去https://github.com/duilib/duilib下载框架,将Duilib框架在UnicodeDebug及Debug下编译生成库文件

下面都是VS2008的环境操作。在VC++ 选项->项目与解决方案-> VC++目录

引入Duilib的

包含文件

MFC中混合使用Duilib制作界面

库文件

MFC中混合使用Duilib制作界面

源文件

MFC中混合使用Duilib制作界面

设置系统的环境变量

MFC中混合使用Duilib制作界面

不设置环境变量的话,也可以直接把DuiLib_ud.dll及DuiLib_d.dll复制到应用程序的生成目录。否则会报缺少相关dll的错误。

 

  1. 添加引用及dll

在stdafx.h文件中加入duilib的头文件及库

 1 #include <ObjBase.h>

 2 #include <UIlib.h>

 3 using namespace DuiLib;

 4 #ifdef _DEBUG

 5 #   ifdef _UNICODE

 6 #       pragma comment(lib, "DuiLib_ud.lib")

 7 #   else

 8 #       pragma comment(lib, "DuiLib_d.lib")

 9 #   endif

10 #else

11 #   ifdef _UNICODE

12 #       pragma comment(lib, "DuiLib_u.lib")

13 #   else

14 #       pragma comment(lib, "DuiLib.lib")

15 #   endif

16 #endif

 

注意:如果将生成的程序拿到其他机器上运行,一定要复制DuiLib的相关Dll到应用程序的根目录。

 

 

  1. 创建对应的类

 

 

创建一个C++类,让这个类继承Duilib的CWindowWndINotifyUI

如下所示:

MFC中混合使用Duilib制作界面

 

在自己定义的类的头文件中加上

1 public:

2 

3 LPCTSTR GetWindowClassName() const;

4 

5 void    Notify(TNotifyUI& msg);

6 

7 LRESULT HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam);

private:



    CPaintManagerUI m_pm;

 

GetWindowClassName

 

GetWindowClassName是设置类的类名称

 

源文件可以如下定义:

1 LPCTSTR CDuiLib_Dialog::GetWindowClassName() const

2 {

3     return (LPCTSTR)"CTestDlg"; /*自己可以随意取个名字*/

4 }

 

Notify

 

Notify是Duilib中控件的响应函数,比如说某个控件按钮点击之后的处理。

源文件可以如下定义:

 1 void CDuiLib_Dialog::Notify(TNotifyUI& msg)

 2 {

 3     if( msg.sType == _T("click") )

 4     {

 5         if( msg.pSender->GetName() == _T("closebtn") )

 6         {

 7             Close();

 8         }

 9     }

10 }

 

HandleMessage

 

HandleMessage是Duilib中对消息循环的消息处理函数。

可以在这个函数中对Duilib进行初始化

源文件可以如下定义:

 1 LRESULT CDuiLib_Dialog::HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)

 2 {

 3     if( uMsg == WM_CREATE )

 4     {

 5         CPaintManagerUI::SetInstance(AfxGetInstanceHandle());//加载XML的时候,需要使用该句柄去定位EXE的路径,才能加载XML的路径

 6         CPaintManagerUI::SetResourcePath(CPaintManagerUI::GetInstancePath() + _T("skin"));//定位图片等资源的位置

 7 

 8         m_pm.Init(m_hWnd);

 9         CDialogBuilder builder;

10         CControlUI *pRoot = builder.Create(_T("MainActivity.xml"), (UINT)0, NULL, &m_pm); //加载的XML文件的名称

11         ASSERT(pRoot && "Failed to parse XML");

12         m_pm.AttachDialog(pRoot);

13         m_pm.AddNotifier(this);

14 

15         return 0;

16     }

17     else if( uMsg == WM_DESTROY )

18     {

19         ::PostQuitMessage(0);

20     }

21     LRESULT lRes = 0;

22 

23     if( m_pm.MessageHandler(uMsg, wParam, lParam, lRes) ) return lRes;

24 

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

26 }

 

 

  1. 创建窗体

 

在主窗体中创建这个Duilib,

 

在主窗体的这个类中加一个刚才增加的类对象 m_dlgDuilib(对象名随意)

通过下面代码创建

1     if(m_dlgDuilib == NULL)

2     {

3         m_dlgDuilib.Create(this->m_hWnd, NULL, UI_WNDSTYLE_DIALOG & (~( WS_BORDER | WS_CAPTION )) , 0, 0, 0, 800, 600);

4     }

5     m_dlgDuilib.CenterWindow();

6     m_dlgDuilib.ShowWindow(TRUE);

 

可以设置打开的窗体样式为

UI_WNDSTYLE_DIALOG & (~(WS_CAPTION | WS_BORDER))

 

 

  1. 设计布局及样式

 

Duilib的窗体布局是通过xml来体现的,在Duilib中有一个Dui Designer,可以通过其进行设计。关于Duilib的使用可以查看这篇文章:http://www.cnblogs.com/lin1270/p/4106944.html

 

Demo下载地址

你可能感兴趣的:(mfc)