解决CMFCMenuButton无法显示右边箭头以及多字节编码下堆破坏的问题
2013-04-25 19:03
381 查看
有时候觉得MFC真TM恶心,就这两个问题花了我好长时间才找到解决办法,记下来以避免搞忘,如果能给读者带来方便那是更好,废话不多说,说正事!
1.无法显示右边箭头的问题
无论怎么折腾都没显示不出来,微软给的示例又能显示,度娘和谷歌也都不知道,经过不断地探索总算找到解决办法了:在rc2文件中加上下面的内容即可
#ifndef _AFXDLL
#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(可以将CMFCButton和CMFCMenuButton的OnDraw合并起来),在GetWindowText那里自己分配一个大一点的缓冲区就行了;这种办法太笨拙了,不推荐。
(2)不写任何代码,直接将Button控件拖入到对话框中,添加变量时变量类型改成CMFCMenuButton就可以了,只不过需要自己设置按钮的一些属性。
好了,就这么多,如果谁有更好的解决办法请指教!
1.无法显示右边箭头的问题
无论怎么折腾都没显示不出来,微软给的示例又能显示,度娘和谷歌也都不知道,经过不断地探索总算找到解决办法了:在rc2文件中加上下面的内容即可
#ifndef _AFXDLL
#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(可以将CMFCButton和CMFCMenuButton的OnDraw合并起来),在GetWindowText那里自己分配一个大一点的缓冲区就行了;这种办法太笨拙了,不推荐。
(2)不写任何代码,直接将Button控件拖入到对话框中,添加变量时变量类型改成CMFCMenuButton就可以了,只不过需要自己设置按钮的一些属性。
好了,就这么多,如果谁有更好的解决办法请指教!
相关文章推荐
- 解决ToolBar中的menu无法同时显示图标和文字的问题
- 使用百度编辑器ueditor表格无法显示边框以及边框颜色等系列问题解决方案
- ruby -- 问题解决(三)编码错误导致无法显示(1)
- 解决ubuntu下无法正确显示GBK编码的问题
- ruby -- 问题解决(四)编码错误导致无法显示(2)
- android listview嵌套viewpager,viewpager嵌套gridview,解决内嵌无法显示以及时间冲突的问题
- 解决 Toolbar 的 Menu 图标无法显示的问题
- IE6的png显示问题以及div无法实现1px高度问题的解决
- 打开网站php出现乱码问题的解决办法以及无法显示验证码
- 解决ubuntu下无法正确显示GBK编码的问题
- Jira饼图上中文乱码,显示为“口”的解决办法,以及问题附件中文名时无法打开终极办法
- 解决WinForm中ComboBox控件的“设置"DataSourse”属性后无法修改项集合”以及两个不相关联的ComboxBox控件实现数据列表显示不可实现的问题
- 关于图片资源在android2.1/2.2/2.3下无法显示的问题以及解决方法
- 如何解决自定义404页面在IE等浏览器中无法显示问题
- 【完美解决系列】Android6.0上菜单栏不显示Menu的问题
- 解决WebView加载离线HTML时白屏、黑屏以及可能不显示的问题
- 解决SecureCRT中文显示乱码和全屏无法显示菜单的问题
- 解决Android调用系统相机拍照后相片无法在相册中显示问题
- 解决Gitlab的Gravatar头像无法显示的问题
- java和vb进行socket通信以及java与c/c++/oc 进行socket通信时汉字字符串编码问题解决