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

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

Duilib支持win32程序及MFC程序。

步骤如下:

  1. 设置Duilib环境

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

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

引入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的CWindowWnd和INotifyUI

如下所示:

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

  1. public:
  2.  
  3. LPCTSTR GetWindowClassName() const;
  4.  
  5. void Notify(TNotifyUI& msg);
  6.  
  7. LRESULT HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam);

  1. private:
  2.  
  3. 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), NULL, &m_pm); //加载的XML文件的名称
  11. ASSERT(pRoot && "Failed to parse XML");
  12. m_pm.AttachDialog(pRoot);
  13. m_pm.AddNotifier(this);
  14.  
  15. return ;
  16. }
  17. else if( uMsg == WM_DESTROY )
  18. {
  19. ::PostQuitMessage();
  20. }
  21. LRESULT lRes = ;
  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 )) , , , , , );
  4. }
  5. m_dlgDuilib.CenterWindow();
  6. m_dlgDuilib.ShowWindow(TRUE);

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

  1. UI_WNDSTYLE_DIALOG & (~(WS_CAPTION | WS_BORDER))
  1. 设计布局及样式

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

Demo下载地址

MFC中混合使用Duilib制作界面的更多相关文章

  1. duilib进阶教程 -- 在MFC中使用duilib (1)

    由于入门教程的反响还不错,因此Alberl就以直播的形式来写<进阶教程>啦,本教程的前提: 1.请先阅读<仿迅雷播放器教程> 2.要有一定的duilib基础,如果还没,请先阅读 ...

  2. 如何在WTL和MFC中使用duilib及如何静态使用duilib库!(初级讲解 附带一个Demo)

    关于duilib的历史,我也就不多说了,能看到这篇文章的人都是有一定了解才能找到这个的. 我直接说下对这个库的基本使用吧. 我个人对一些好技术都是比较感兴趣的. 因为个人原因 喜欢接触一个好技术. 所 ...

  3. VS2010 MFC中制作Visual Studio风格的停靠侧栏窗口(CDockablePane里嵌套FormView表单视图)

    VS2010 MFC中制作Visual Studio风格的停靠侧栏窗口(CDockablePane里嵌套FormView表单视图) 1. 在资源窗口里新建一个FormView的Dialog,修改ID为 ...

  4. MFC中快速应用OpenCV(转)

    转载链接:http://wiki.opencv.org.cn/index.php/MFC%E4%B8%AD%E5%BF%AB%E9%80%9F%E5%BA%94%E7%94%A8OpenCV 简介和缘 ...

  5. 在MFC中添加OpenGL窗口

    虽然MFC已经落伍好多年,而且用来做界面非常的不好用...但是我既不会C#也不会QT,又需要使用OpenGL,就只能将就用了...   一.首先介绍Windows图像程序设计中几个重要的概念:   G ...

  6. MFC中使用FLASH

    一.准备工作 第一步:下载并安装Adobe Flash Player. 从官方网站(http://get.adobe.com/cn/flashplayer/)上下载最新的Flash Player(大约 ...

  7. MFC中的各种DC区别

    转载自:xntop的<区别MFC中的CClientDC.CWindowDC.CPaintDC.CMetaFileDC> CClientDC及其子类 1. CClientDC类只能在客户区绘 ...

  8. MFC中对话框类(Dialog)的应用

    转载http://hi.baidu.com/jackywdx/item/feee8041d2c2e12310ee1e85 Windows应用程序通常是通过对话框接收用户输入.向用户输出信息,本节介绍应 ...

  9. MFC中添加消息响应函数

    转自:http://blog.csdn.net/eddy_liu/article/details/8474677 目前,用MFC设计的Windows应用程序几乎都采用文档/视图结构.这种程序框架与简单 ...

随机推荐

  1. C#自学系列 - 开篇

    2014年即将过去,这一年我参加了不少面试,被问到了很多问题.回来总结下发现自己确实在基础方面有着很多的不足,还有很多东西是我不知道的.遂在下半年购入书籍若干,并系统的加以学习.我目前在看的书是Jon ...

  2. Asp.Net Web API 2第十三课——ASP.NET Web API中的JSON和XML序列化

    前言 阅读本文之前,您也可以到Asp.Net Web API 2 系列导航进行查看 http://www.cnblogs.com/aehyok/p/3446289.html 本文描述ASP.NET W ...

  3. 在Mac OS X上用自己编译出的CoreCLR运行.NET程序

    当昨天被Mac OS X上无法编译CoreCLR的问题困扰时(详见Mac OS X上尝试编译CoreCLR源代码),后来发现这个难题竟然被神人@kangaroo给解决了,连CoreCLR的微软开发人员 ...

  4. AutoMapper中的Map和DynamicMap——高手注重细节,思考和总结

    近日在做项目的时候,遇到了个怪问题,关于AutoMapper的细节问题,也是不为一般人所关注的. 本人研究AutoMapper也没有多长时间,而且研究的过程中也写了关于AutoMapper的系列基础教 ...

  5. Run Android on Your Netbook or Desktop

    Run Android on Your Netbook or Desktop Would you like to try out Google's Android OS on your netbook ...

  6. Redis教程(十):持久化详解

    转载于:http://www.itxuexiwang.com/a/shujukujishu/redis/2016/0216/137.html 一.Redis提供了哪些持久化机制: 1). RDB持久化 ...

  7. duilib进阶教程 -- 各种控件的响应 (10)

    到上一个教程为止,界面显示的代码就都介绍完啦,现在开始介绍控件的响应,其实在<2013 duilib入门简明教程 -- 事件处理和消息响应 (17)>里已经列出了duilib自己定义的所有 ...

  8. paip.提升效率--调试--日志系统日志参数含义---python

    paip.提升效率--调试--日志系统日志参数含义---python #同时向控制台和文件输出日志 #日志参数含义 import logging log_format = '%(filename)s ...

  9. 【关于新版Cocos2dx/Cocos2d-JS】安装包和使用方式的变化

    最近有读者反馈说,最新的Cocos2dx或者说2d-JS下载之后跟书本说的安装方式相差很大. 刚下载最新版3.9试了一下,其实用法还是没有变的. 新版把cocos2dx和cocos2d-js合并了,这 ...

  10. CSS3参考手册

    很好用的CSS3 API http://www.css88.com/book/css/