如何在WTL和MFC中使用duilib及如何静态使用duilib库!(初级讲解 附带一个Demo)
关于duilib的历史,我也就不多说了,能看到这篇文章的人都是有一定了解才能找到这个的。
我直接说下对这个库的基本使用吧。
我个人对一些好技术都是比较感兴趣的.
因为个人原因 喜欢接触一个好技术。
所以当我遇到这个库的时候 毅然选择用这个库写项目中的一部分了,就是treeview控件。
因为我的项目原来已经是一个成型的项目了,只是作为改进。如果将现有项目完全的改成duilib的 那么和重写没有任何区别。
所以我选择了一条看似荆棘满地的路--就是在WTL现有项目中嵌入进duilib。做一颗treeview控件。
现在把我在实现过程中遇到的问题及解决方法列举一下 以便大家以后遇到问题的时候做一个参考。
1.我喜欢用静态库,不喜欢用动态库,用动态库就好像穿衣服还要随身携带衣架一样,多余还麻烦。
所以在用这个库的时候 第一件事就是把动态库变成静态库。还有改用成 unicode字符集
(1).找到uilib.h头文件 注释掉原有的定义:添加新的宏 #define UILIB_API
//#ifdef UILIB_EXPORTS
//#define UILIB_API __declspec(dllexport)
//#else
//#define UILIB_API __declspec(dllimport)
//#endif
(2)编译后不会报错,然后 在使用时就可以直接包含这个静态库了 同时要注意一点 还需要包含 几个静态库oledlg.lib dui.lib winmm.lib comctl32.lib
虽然也不简单,但是却可以让程序生成后 只有一个exe 也没有其他累赘。
2. 包含之后 编译工程 会报错createtextserver没有定义什么的。这个是因为新版本中加入了richedit支持,这个directui的 需要用到 texthost和textserver 这时候 需要引用richedit.dll和richedit.lib 为了方便,我把这部分的导入 放到了duilib库里面了。 至于是什么代码我就不贴了
导入库的代码 是个程序员就会了。
3.如果你的wtl ATL MFC文件已经包含了 atltypes之类的头文件,那你会发现会出N多的 crect cpoint csize等 说不知道用哪个。因为duilib自己实现了这三个函数 和ATL MFC WL里面的冲突了。那么这时候怎么办呢?.. 当然是用宏了,我们在duilib的 uibase.h下面可以找到他们定义 在定义前加#ifndef
DUI_NOTYPES 定义后追加 #endif 这样我们在WTL中引入duilib库的时候 引用前加入 #define DUI_NOTYPES 就可以屏蔽掉那些错误了。
4. 接下来的问题 都快让我崩溃了,不过最后还是解决了。
在前面问题逐一解决之后 你会发现 项目里的很多地方都莫名其妙的报错了,甚至连最基本的 CDC CmemeryDC Cpen什么的都不认了 报一堆错误。
错误原因在于duilib里面的 windowsx.h头文件,这个是sdk编程人员不可能不知道的头文件了,里面是一些宏的定义,大大的方便了sdk编程。
而在这里却成了阻碍,那么怎么办呢? 我看了下报错的地方 又看了下windowsx里面宏,发现其实原因很简单,里面的一些宏定义和WTL的函数定义冲突了。那么这个时候 我们需要使用微软的 函数保护机制了。在我的项目中有冲突的是下面几个函数 SelectFont SelectPen 其实还有很多 selectbrush等。报什么错就加什么 没有必要一次加齐。
#ifdef _INC_WINDOWSX
#undef SelectFont
#undef SelectPen
#endif // _INC_WINDOWSX
5.那么到这个时候就可以正常的在WTL中使用duilib库了。
6.那么我们来说说 那棵树的实现。
树无疑 就是里面的list靠缩进实现了。节点我选择用以下模式做的。这样后面排序的时候 我只需要交换CHorizontalLayoutUI就可以了 而无须改变
CListContainerElementUI 索引号了。
CListContainerElementUI
CHorizontalLayoutUI
控件
控件
CHorizontalLayoutUI
CListContainerElementUI
7.自动计算下滚动条!
CListContainerElementUI 没有自动计算下滚动条的功能,可能是因为是容器 里面的东西多少位置之类的都无法确定吧。
我的项目为了针对我这个项目 我在CHorizontalLayoutUI 插入了Ctextui 在底层库里面加入自动计算Ctextui 的宽度并设置CListContainerElementUI 宽度的逻辑就可以了
在这个过程总需要注意CListContainerElementUI 的setfixwight 有刷新的 会导致死循环 所以要加一个默认参数。
8.排序 排序就不多说的 原理比较简单 一个快速排序,然后 颠倒CHorizontalLayoutUI和 tag就可以了、我的快排写的 比较麻烦好像 因为当时比较着急 写的时候比较乱 不过还可以 至少实现功能了,但是目前只是叶子节点排序,如果想实现非叶子节点排序也不是不可以,但是会比较麻烦 因为我也不用 就没写,有兴趣的自己写下吧。
9.最后 因为群里面有人希望出一个demo 我就简单写一个demo 但是没再WTL用 因为怕麻烦。
demo真是非常之简单,只有一个treeviwe 其他的什么都没有.连标题栏什么都没写 那些我相信大家很简单的就能写出来。我把demo放到csdn上 想看的下载吧 。
先贴图:treeviewdemo 点击这里下载源码
哦 对了 忘了 QQ:672496008 如果有编译不了 或者什么地方不明白的可以问我... 就这个demo而言我还是会的。
超出这个demo范围我可能就帮不上忙了 我也才接触1个星期而已!
原文:http://blog.csdn.net/lin98666lin/article/details/6580461
如何在WTL和MFC中使用duilib及如何静态使用duilib库!(初级讲解 附带一个Demo)的更多相关文章
- 如何在ASP.NET Core中构造UrlHelper,及ASP.NET Core MVC路由讲解
参考文章: Unable to utilize UrlHelper 除了上面参考文章中介绍的方法,其实在ASP.NET Core MVC的Filter拦截器中要使用UrlHelper非常简单.如下代码 ...
- 【vs2013】如何在VS的MFC中配置使用GDI+?
摘自:http://www.cnblogs.com/CSGrandeur/p/3156843.html (已实验,可行) 1.配置GDI+ VS2010自带GDI+,直接使用. (1)首先要添加头文件 ...
- MFC中菜单变灰的问题
MFC中菜单变灰 方法1:有UpdateCmdUI句柄时 定义一个BOOL变量m_b来标志菜单项是否有效, 该菜单项响应UPDATE_COMMAND_UI消息,在消息处理函数中pCmdUI->E ...
- 如何在 Kubernetes 集群中玩转 Fluid + JuiceFS
作者简介: 吕冬冬,云知声超算平台架构师, 负责大规模分布式机器学习平台架构设计与功能研发,负责深度学习算法应用的优化与 AI 模型加速.研究领域包括高性能计算.分布式文件存储.分布式缓存等. 朱唯唯 ...
- MFC中混合使用Duilib制作界面
因为公司项目最近入了MFC的这个大坑,用MFC做UI做了一段时间,感觉不是很方便,开发效率有点慢. 看了c++里面做界面的类库,感觉Duilib比较符合做界面的需求,而且很多大公司也在使用Duilib ...
- duilib进阶教程 -- 在MFC中使用duilib (1)
由于入门教程的反响还不错,因此Alberl就以直播的形式来写<进阶教程>啦,本教程的前提: 1.请先阅读<仿迅雷播放器教程> 2.要有一定的duilib基础,如果还没,请先阅读 ...
- 【VS开发】【CUDA开发】如何在MFC中调用CUDA
如何在MFC中调用CUDA 有时候,我们需要在比较大的项目中调用CUDA,这就涉及到MFC+CUDA的环境配置问题,以矩阵相乘为例,在MFC中调用CUDA程序.我们参考罗振东iylzd@163.com ...
- (转)MFC中获得各个类的指针/句柄 ID的总结
http://www.cnblogs.com/ylhome/archive/2009/10/06/1578478.html 一般我们使用的框架是VC提供的Wizard生成的MFC App Wizard ...
- 怎样在VS2013/MFC中使用TeeChart绘图控件
TeeChart作为一款强大好用的绘图控件,通过它可以绘制出各式各样的图表,包括2D的,还有3D的,绘制的图表美观实用,这里主要讲述如何在VS2013/MFC中使用TeeChart控件,顺便说一下在V ...
随机推荐
- C#代码 利用MongoDB中Group聚合函数查询
例子: public static void getUserRFM(DateTime beginTime, DateTime endTime) { MongoDat ...
- 《day09---继承-抽象类-接口》
//面向对象_继承_概述---单继承_多继承. //描述学生. /* class Student { //属性. String name; int age; //行为: void study() { ...
- passivedns 安装指南
install passivedns on ubuntu Passive DNS对安全研究非常重要,因为它可以在前期帮助我们构建出目标的基础设施结构,并且可以得到以下三方面的答案:该域名曾经绑定过哪些 ...
- hdoj-2031
#include "stdio.h"#include "stdlib.h"int main(){ char a[]={'0','1','2','3','4',' ...
- 集合set的使用
将无序对象储存在集合中 集合是类似于数组的一组对象,只是其中包含的项目是无序的(而数组是有序的).您通过枚举集合中的对象,或者将过滤器或测试应用到集合,来随机访问集合中的对象(使用 anyObject ...
- js中的apply调用
今天看了阮一锋老师的一篇文章,感觉很明了对闭包的理解,尤其是文章中的apply的介绍 apply()是函数对象的一个方法,它的作用是改变函数的调用对象,它的第一个参数就表示改变后的调用这个函数的对象. ...
- 一群猴子排成一圈,按1,2,...n 编号,数到m只,踢出局,直到剩下最后一个猴子是大王
<?php/***function king*@param $m 数到m个数, $n 猴子个数*return int*/function king($m, $n){ //定义数组, 值为猴 ...
- UVA1476 三分法
单峰函数(即先递增后递减,有极大值的函数),都可以用三分法来求 #include <iostream> #include <cmath> #include <cstdio ...
- Rest文件上传
文件上传时传过来一个stream 代码如下: /// <summary> /// 上传文件 /// </summary> /// <param name="fi ...
- [转]慎用slice
在go中,slice是对固定长度数组的一段切片,其底层是用对数值空间的指针实现的. 在slice的赋值过程中,slice的容量会被初始化成“数组长度 - slice的起点位置”,举例说明: 假设有长度 ...