博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
CMFCControl 问题
阅读量:4298 次
发布时间:2019-05-27

本文共 1742 字,大约阅读时间需要 5 分钟。

解决CMFCMenuButton无法显示右边箭头以及多字节编码下堆破坏的问题

 

有时候觉得MFCTM恶心,就这两个问题花了我好长时间才找到解决办法,记下来以避免搞忘,如果能给读者带来方便那是更好,废话不多说,说正事!

 

1.无法显示右边箭头的问题 (Can't load bitmap: 42b8. GetLastError() = 716 有时)

 

无论怎么折腾都没显示不出来,微软给的示例又能显示,度娘和谷歌也都不知道,经过不断地探索总算找到解决办法了:在rc2文件中加上下面的内容即可

 

#ifndef _AFXDLL  //许多其他CMFCCOntrol类型的问题 都需要此处更改

#include "afxribbon.rc"      // Ribbon and control bars

#endif

 

当然,要想按钮有XP的风格,还需要在App类的InitInstance中加上

CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerWindows));

然而这样在关闭程序时会发现有内存泄漏,输出窗口中出现如下内容:

 

Init CriticalSection spin count CDLPShareMemConfig::Close()CDLPShareMemConfig::Close()TSWebDownLoadProtect.dll is Load failedTSWebMon.dat is Load failedDetected memory leaks!

Dumping objects ->

f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\afxvisualmanagerwindows.cpp(35) : {487} client block at 0x001C9318, subtype c0, 376 bytes long.

a CMFCVisualManagerWindows object at $001C9318, 376 bytes long

Object dump complete.

 

显然,这是由于RUNTIME_CLASS(CMFCVisualManagerWindows)动态创建了一个CMFCVisualManagerWindows的实例没有释放,不知道CMFCVisualManager在搞什么,在吃SHI吗,还需要我们手动释放,既然它不作为,那我们只有自己干了,在ExitInstance中加上CMFCVisualManagerWindows::DestroyInstance();就好了

 

2. 多字节编码下堆破坏

如果你建的项目是使用的Unicode编码,那么在Debug模式下没有问题,Release模式下同样会出现堆破坏的错误,程序根本没法启动!如果是多字节编码,那么对不起,任何模式都不行,不知道MFC怎么搞的!

没办法,总得知道原因出在哪里吧,找到MFC的源码(源码怎么找相信大家都知道,就在VS安装目录下\VC\atlmfc\src\mfc下面,查找包含CMFCMenuButton字符串的文件,怎么搜索不用我说了吧,在Win7下改一下搜索选项就可以了),在OnDraw里面打断点,发现问题出在CMFCButton::OnDraw那一行,继续调CMFCButton::OnDraw,发现问题出在GetWindowText,用一个大一点的缓冲区来存获得的文本吧,发现文本后面被填入了"\0 MFCMenuButton",乖乖,多出这么长一截,堆能不被破坏吗?

 

解决办法有两个:

1)重载CMFCMenuButton,自己实现OnDraw(可以将CMFCButtonCMFCMenuButtonOnDraw合并起来),在GetWindowText那里自己分配一个大一点的缓冲区就行了;这种办法太笨拙了,不推荐。

2)不写任何代码,直接将Button控件拖入到对话框中,添加变量时变量类型改成CMFCMenuButton就可以了,只不过需要自己设置按钮的一些属性。

好了,就这么多,如果谁有更好的解决办法请指教!

 

 

转载地址:http://mmnws.baihongyu.com/

你可能感兴趣的文章
springboot(六)配置swagger2
查看>>
springboot(七)redis 实现session共享
查看>>
springboot(八)拦截器之验证登录
查看>>
springboot(九)添加jsp支持
查看>>
idea使用git和GitHub-for-windows比较
查看>>
rabbitmq安装
查看>>
springboot(十二)整合rabbitmq
查看>>
MapReduce的 Speculative Execution机制
查看>>
大数据学习之路------借助HDP SANDBOX开始学习
查看>>
Hadoop基础学习:基于Hortonworks HDP
查看>>
为什么linux安装程序 都要放到/usr/local目录下
查看>>
Hive安装前扫盲之Derby和Metastore
查看>>
永久修改PATH环境变量的几种办法
查看>>
大数据学习之HDP SANDBOX开始学习
查看>>
Hive Beeline使用
查看>>
Centos6安装图形界面(hdp不需要,hdp直接从github上下载数据即可)
查看>>
CentOS7 中把yum源更换成163源
查看>>
关于yum Error: Cannot retrieve repository metadata (repomd.xml) for repository:xxxxxx.
查看>>
linux下载github中的文件
查看>>
HDP Sandbox里面git clone不了数据(HTTP request failed)【目前还没解决,所以hive的练习先暂时搁置了】
查看>>