MFC中混合使用Duilib制作界面
因为公司项目最近入了MFC的这个大坑,用MFC做UI做了一段时间,感觉不是很方便,开发效率有点慢。
看了c++里面做界面的类库,感觉Duilib比较符合做界面的需求,而且很多大公司也在使用Duilib,那就随一下大流,并在此表达对Duilib作者及广大的开源作者的敬意。
Duilib支持win32程序及MFC程序。
步骤如下:
设置Duilib环境
可以去https://github.com/duilib/duilib下载框架,将Duilib框架在UnicodeDebug及Debug下编译生成库文件
下面都是VS2008的环境操作。在VC++ 选项->项目与解决方案-> VC++目录
引入Duilib的
包含文件
库文件
源文件
设置系统的环境变量
不设置环境变量的话,也可以直接把DuiLib_ud.dll及DuiLib_d.dll复制到应用程序的生成目录。否则会报缺少相关dll的错误。
添加引用及dll
在stdafx.h文件中加入duilib的头文件及库
#include <ObjBase.h>
#include <UIlib.h>
using namespace DuiLib;
#ifdef _DEBUG
# ifdef _UNICODE
# pragma comment(lib, "DuiLib_ud.lib")
# else
# pragma comment(lib, "DuiLib_d.lib")
# endif
#else
# ifdef _UNICODE
# pragma comment(lib, "DuiLib_u.lib")
# else
# pragma comment(lib, "DuiLib.lib")
# endif
#endif
注意:如果将生成的程序拿到其他机器上运行,一定要复制DuiLib的相关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
GetWindowClassName是设置类的类名称
源文件可以如下定义:
LPCTSTR CDuiLib_Dialog::GetWindowClassName() const
{
return (LPCTSTR)"CTestDlg"; /*自己可以随意取个名字*/
}
Notify
Notify是Duilib中控件的响应函数,比如说某个控件按钮点击之后的处理。
源文件可以如下定义:
void CDuiLib_Dialog::Notify(TNotifyUI& msg)
{
if( msg.sType == _T("click") )
{
if( msg.pSender->GetName() == _T("closebtn") )
{
Close();
}
}
}
HandleMessage
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), NULL, &m_pm); //加载的XML文件的名称
ASSERT(pRoot && "Failed to parse XML");
m_pm.AttachDialog(pRoot);
m_pm.AddNotifier(this); return ;
}
else if( uMsg == WM_DESTROY )
{
::PostQuitMessage();
}
LRESULT lRes = ; 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 )) , , , , , );
}
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下载地址
MFC中混合使用Duilib制作界面的更多相关文章
- duilib进阶教程 -- 在MFC中使用duilib (1)
由于入门教程的反响还不错,因此Alberl就以直播的形式来写<进阶教程>啦,本教程的前提: 1.请先阅读<仿迅雷播放器教程> 2.要有一定的duilib基础,如果还没,请先阅读 ...
- 如何在WTL和MFC中使用duilib及如何静态使用duilib库!(初级讲解 附带一个Demo)
关于duilib的历史,我也就不多说了,能看到这篇文章的人都是有一定了解才能找到这个的. 我直接说下对这个库的基本使用吧. 我个人对一些好技术都是比较感兴趣的. 因为个人原因 喜欢接触一个好技术. 所 ...
- VS2010 MFC中制作Visual Studio风格的停靠侧栏窗口(CDockablePane里嵌套FormView表单视图)
VS2010 MFC中制作Visual Studio风格的停靠侧栏窗口(CDockablePane里嵌套FormView表单视图) 1. 在资源窗口里新建一个FormView的Dialog,修改ID为 ...
- 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 简介和缘 ...
- 在MFC中添加OpenGL窗口
虽然MFC已经落伍好多年,而且用来做界面非常的不好用...但是我既不会C#也不会QT,又需要使用OpenGL,就只能将就用了... 一.首先介绍Windows图像程序设计中几个重要的概念: G ...
- MFC中使用FLASH
一.准备工作 第一步:下载并安装Adobe Flash Player. 从官方网站(http://get.adobe.com/cn/flashplayer/)上下载最新的Flash Player(大约 ...
- MFC中的各种DC区别
转载自:xntop的<区别MFC中的CClientDC.CWindowDC.CPaintDC.CMetaFileDC> CClientDC及其子类 1. CClientDC类只能在客户区绘 ...
- MFC中对话框类(Dialog)的应用
转载http://hi.baidu.com/jackywdx/item/feee8041d2c2e12310ee1e85 Windows应用程序通常是通过对话框接收用户输入.向用户输出信息,本节介绍应 ...
- MFC中添加消息响应函数
转自:http://blog.csdn.net/eddy_liu/article/details/8474677 目前,用MFC设计的Windows应用程序几乎都采用文档/视图结构.这种程序框架与简单 ...
随机推荐
- Linux:文件解压与压缩
文件打包与压缩 常见压缩文件格式: |文件后缀名 |说明| |.zip |zip程序打包压缩的文件| |.rar |rar程序压缩的文件| |.7z |7zip程序压缩的文件| |.tar |tar程 ...
- ajaxSubmit与ajaxFileUpload的空值
ajaxSubmit发现正文无内容, ajaxFileUpload发现无上传内容, 嗯,你只是忘记了 html 中控件的 name 没有指定,这哥们不认 id 的.
- Mathematica修改默认字体
1. 打开Option Inspector 2. 第一个下拉框选择Global Preference, 搜索stylehints 3. 修改字体为想要换的字体FamilyName, 比如换成苹果黑体 ...
- Redis教程(七):Key操作命令详解
转载于:http://www.itxuexiwang.com/a/shujukujishu/redis/2016/0216/134.html?1455807040 一.概述: 在该系列的前几篇博客中, ...
- LINQ-to-SQL那点事~LINQ-to-SQL中的数据缓存与应对
回到目录 这个文章写的有点滞后了,呵呵,因为总想把之前不确定的东西确定了之后,再写这篇,之前的LINQ-to-SQL那点事,请点这里. LINQ-to-SQL中的数据缓存与应对 Linq-to-SQL ...
- struts2学习笔记之四:多配置文件支持和常用配置参数
struts2支持可以按照不同模块分类的方式拆分配置文件,支持多人分工合作,各自维护自己的配置文件,但是所有配置文件中包名和action的名称不能重复 struts2的配置文件方式有两种,stru ...
- ubuntu下安装 infer
sudo apt-get updatesudo apt-get upgradesudo apt-get install git openjdk-7-jdk m4 zlib1g-dev python-s ...
- 通过修改host文件来允许和禁止主机的访问
通过修改host文件来允许和禁止主机的访问 修改/etc/hosts.deny,加入"sshd:ALL" 修改/etc/hosts.allow,加入"sshd:192.1 ...
- iOS设备类型
通常App都会采集用户的设备信息,比如设备类型.网络类型.内存大小等,而拿到的数据比如:iPhone 8,1是什么意思?代表iOS 8.1吗,非也.这里放二个网站大家可以上去查一查,在统计分析的系统里 ...
- 斐波那契数列(Fibonacci)递归和非递归实现
序列前9项为:0, 1, 1, 2, 3, 5, 8, 13, 21 要注意非递归的话就是那一个变量帮助存储当前下一项的值,然后依次挪动两个指针往下即可 注意如果n太大 会溢出 ...