duilib进阶教程 -- 在MFC中使用duilib (1)
由于入门教程的反响还不错,因此Alberl就以直播的形式来写《进阶教程》啦,本教程的前提:
1、请先阅读《仿迅雷播放器教程》
2、要有一定的duilib基础,如果还没,请先阅读《2013 duilib入门简明教程》。
3、下载基于VLC的MFC播放器(包含VLC等所有文件),csdn不允许上传相似的代码,因此后面的教程将不再上传VLC的dll、头文件等没有改变的文件。
《仿迅雷播放器教程 -- 基于VLC的MFC播放器 (6)》中界面是用MFC做的,因此我们要将它换成duilib。而在《2013 duilib入门简明教程 -- 结合win32和MFC (16)》中只讲了怎么在duilib中显示MFC窗口,以及在MFC中显示duilib窗口,但是没有讲消息的响应,因此有些基础薄弱的小伙伴还是不懂,这里借着这个机会讲解一下消息的响应,下面进入正题。
之前的MFC界面如下:
现在我们将左边的三个按钮换成迅雷的,如下:
其中左边那块是纯duilib的界面,右边那块是在duilib的窗口里放了一个win32控件,这六个按钮都是有消息响应的,因此本教程实现了以下功能:
1、在MFC窗口显示了duilib窗口,并响应了duilib的控件。
2、在duilib的窗口显示了win32的控件,并响应了win32的控件。
所以与MFC结合的知识已经全面覆盖了(与win32结合也是类似的),到此,就不用担心老项目使用duilib带来问题了。
界面显示已经在《2013 duilib入门简明教程 -- 结合win32和MFC (16)》讲过了,那么这里只讲消息响应。
一、纯duilib控件的响应:
只需在Notify函数做响应就行了,其中m_pDlgMain是MFC主窗口的指针。
void CDuiFrameWnd::Notify( TNotifyUI& msg )
{
if (m_pDlgMain)
{
if( msg.sType == _T("click") )
{
if( msg.pSender->GetName() == _T("btnPrevious") )
{
m_pDlgMain->OnBnClickedButtonPlayPrevious();
}
else if( msg.pSender->GetName() == _T("btnNext") )
{
m_pDlgMain->OnBnClickedButtonPlayNext();
}
else if( msg.pSender->GetName() == _T("btnPlay") )
{
m_pDlgMain->OnBnClickedButtonPlay();
}
}
} __super::Notify(msg);
}
可见原有的MFC代码基本无需改动,是不是很简单呢~O(∩_∩)O~
二、duilib中MFC控件的响应
由于duilib不够成熟,很多东西都要自己去处理,而如果水平不够的话,就很可能做不出来,已经有很多网友因为有些控件很难实现而放弃了。因此这种情况下,如果某个控件很难实现,我们用MFC的控件代替就是非常适合的,并且很多控件即使duilib能做出来,也还是取代不了MFC控件,比如虚拟表格等等,这些MFC控件已经很成熟了,并且界面也不难看,可自行定制,而如果用duilib去做虚拟表格的话,工作量肯定是很大的,因此这种情况下,也建议用MFC控件。那么在duilib中显示的MFC控件怎么响应呢?
其实也很简单,回到win32就行了,我们只需截获WM_COMMAND,而duilib的WM_COMMAND等windows消息可以在HandleMessage函数里截获,代码如下:
LRESULT CDuiFrameWnd::HandleMessage( UINT uMsg, WPARAM wParam, LPARAM lParam )
{
switch (uMsg)
{
case WM_COMMAND:
if (IDC_BUTTON_DUI_NEXT == wParam)
{
if (m_pDlgMain)
{
m_pDlgMain->OnBnClickedButtonPlayNext();
}
}
break;
default:
break;
} return __super::HandleMessage(uMsg, wParam, lParam);
}
也是非常简单!
现在已经可以去试试效果啦,左边那三个按钮和右边那三个按钮的效果完全一样!
从这个例子可以看出,无论是在duilib里使用MFC,还是在MFC中使用duilib,都不需要改动原有项目,和MFC结合是不是很有用呢~O(∩_∩)O~
代码下载:http://download.csdn.net/detail/qq316293804/6426325
duilib进阶教程 -- 在MFC中使用duilib (1)的更多相关文章
- duilib进阶教程 -- 总结 (17)
整个教程的代码下载:http://download.csdn.net/detail/qq316293804/6502207 (由于duilib进阶教程主要介绍界面,所以这个教程只给出界面相关的代码,完 ...
- duilib进阶教程 -- Container控件的bug (14)
在<duilib进阶教程 -- TreeView控件的bug (9)>里,Alberl发现了两个bug,并解决了其中一个,现在教程已经接近尾声啦,所以Alberl就解决了另外一个bug. ...
- duilib进阶教程 -- TreeView控件(6)
代码下载:http://download.csdn.net/detail/qq316293804/6483905 上一个教程中,界面已经和迅雷一模一样啦,大小和位置一个像素都不差哟,亏得Alberl调 ...
- MFC中混合使用Duilib制作界面
因为公司项目最近入了MFC的这个大坑,用MFC做UI做了一段时间,感觉不是很方便,开发效率有点慢. 看了c++里面做界面的类库,感觉Duilib比较符合做界面的需求,而且很多大公司也在使用Duilib ...
- 如何在WTL和MFC中使用duilib及如何静态使用duilib库!(初级讲解 附带一个Demo)
关于duilib的历史,我也就不多说了,能看到这篇文章的人都是有一定了解才能找到这个的. 我直接说下对这个库的基本使用吧. 我个人对一些好技术都是比较感兴趣的. 因为个人原因 喜欢接触一个好技术. 所 ...
- duilib进阶教程 -- Container控件 (3)
前面两个教程的目的是教大家与MFC结合,那么从这篇起,将不再使用MFC,而使用纯win32项目,本文的所有知识已经在<duilib入门教程>里面讲过了,因此基础知识不再赘述. 代码下载:h ...
- duilib进阶教程 -- 在duilib中使用MFC (2)
好人做到底,送佛送到西.虽然上一篇教程已经说得很详细了,但Alberl还是再举一个例子.上一篇教程的主窗口是MFC的,所以这篇教程把主窗口换成duilib的~O(∩_∩)O~ 1.我们利用<20 ...
- duilib进阶教程 -- 改进List控件 (16)
一.控件隐藏后,允许用代码操作所有行为. 在做播放器的时候,最常用的功能莫过于顺序播放.随机播放了,而当我们切换歌曲的时候,显然应该选中该歌曲,List的选中函数是SelectItem,但是调用此函数 ...
- duilib进阶教程 -- 设置资源路径 (15)
在前面的教程里,虽然图片都放到了skin文件夹里,但是XML却都在外面,当XML比较多时,就不太好看啦,如下图: 所以需要整理一下,将XML也放入skin文件夹,这样exe的目录就简洁多了: 将XML ...
随机推荐
- CocosCreator核心概念里的基础点
1,锚点:是节点位置的参照点,也是自身旋转,缩放的基准点,也是子节点坐标原点.X.Y描述横纵向的锚点位置.注:锚点的取值是可以超过(0,0)~(1,1),即锚点并不在节点尺寸范围内. 2,子节点:子节 ...
- linux 卸载数据库
Linux下卸载DB2数据库步骤: 1.Remove DB[首先删除数据库](1)su - db2inst1(2)db2 list db directory(3)db2 drop db <db ...
- JDBC(3)—ResultSet结果集
简介:ResultSet:结果集.封装了使用JDBC进行查询的结果.Statement只能进行更新操作,所以使用ResultSet进行查询操作. 1.调用Statement对象的executeQuer ...
- iptables设置端口转发
转自:https://blog.csdn.net/sigangjun/article/details/17412821 一 从一台机到另一台机端口转发 启用网卡转发功能 #echo 1 > /p ...
- cordova性能优化方法
做了几个cordova的项目,觉得webapp性能的确是比不上原生,在IOS上还好,安卓上特别的明显.技术群里面很多人都在说cordova是个渣,没用之类的.其实只是很多人没有深入去了解,做点小优化, ...
- Asp.Net Core 通过自定义中间件防止图片盗链的实例(转)
一.原理 要实现防盗链,我们就必须先理解盗链的实现原理,提到防盗链的实现原理就不得不从HTTP协议说起,在HTTP协议中,有一个表头字段叫referer,采用URL的格式来表示从哪儿链接到当前的网页或 ...
- Java SPI机制学习笔记
最近在阅读框架源代码时,常常看到 SPI 的子包, 忍不住查了下: Service Provider Interface : 服务提供接口. JavaSPI 实际上是“基于接口的编程+策略模式+配置文 ...
- Go语言之高级篇beego框架之view
1.基本语法 go统一使用了{{ 和 }}作为左右标签,没有其它的标签符号. 如果你想要修改为其它符号,可以修改配置文件. 使用.来访问当前位置的上下文 使用$来引用当前模板根级的上下文 2.使用方法 ...
- DNS缓存中毒是怎么回事?
近来,网络上出现互联网漏洞——DNS缓存漏洞,此漏洞直指我们应用中互联网脆弱的安全系统,而安全性差的根源在于设计缺陷.利用该漏洞轻则可以让用户无法打开网页,重则是网络钓鱼和金融诈骗,给受害者造成巨大损 ...
- log4net.Layout.PatternLayout 用 conversion 模式格式化日志事件【翻译】
原文地址 log4net.Layout.PatternLayout,是一个灵活的布局,配置模式字符串. 线程安全.该类型的 Public static 成员对多线程操作是安全的.实例成员不保证线程安全 ...