惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Engineering at Meta
Engineering at Meta
D
Docker
IT之家
IT之家
博客园_首页
罗磊的独立博客
V
V2EX
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
美团技术团队
Y
Y Combinator Blog
博客园 - 聂微东
量子位
阮一峰的网络日志
阮一峰的网络日志
GbyAI
GbyAI
Microsoft Security Blog
Microsoft Security Blog
博客园 - Franky
Martin Fowler
Martin Fowler
Jina AI
Jina AI
大猫的无限游戏
大猫的无限游戏
C
Check Point Blog
月光博客
月光博客
G
Google Developers Blog
B
Blog
T
The Blog of Author Tim Ferriss
爱范儿
爱范儿

博客园 - JohnsonFeng

JavaScript 性能优化 --By Google V8 Team Manager 在C++中嵌入JavaScript——Google V8 JavaScript Engine使用体验 介绍相似图片搜索:TinEye VC环境OpenSSL编译笔记 Nginx Server 加密库相关资源 C++中使用Expat解析XML 在C++应用中通过Luabind使用lua脚本(一) - JohnsonFeng - 博客园 在动作捕捉系统中使用加速度和倾角传感器 游戏需求分析 [Foward]Reduce Exe File Size IOCP在网络应用中常见错误分析 Direct3D程序调试利器 PIX Win 简介 数据自解压简单原理 编写和调试Shader程序(1) 生成均匀“随机数”,一种生成均匀分布数字的简单方法 Visual C++ Profile的简单使用方法 C++简单的函数计时方法 [转]About SIGGRAPH
慎用CMFCToolBar::CreateEx
JohnsonFeng · 2009-12-09 · via 博客园 - JohnsonFeng

MFC Feature Pack/VC2008 SP1提供了新的控件,这包括以前需要花费购买的控件,这些控件原来由BCG Soft 开发,在VS2008发布后,被收入后以FeaturePack或SP1的方式发布(VS2008安装包原本没有此功能包,必须额外安装)。对很多用户来说,属性列表控件、真彩色工具条、工具条、停靠栏、更换皮肤、标签式多文档、智能停靠、个性化布局,还有Office、VS中众多的的控件都包含在这个功能包中,这个SP1,是MFC控件库在1998年发布后的首次重大更新,对于MFC程序员,值得体验。

因为这些新的控件给开发带来很多便利,我们使用了VS2008,但是这两个月一直被一个问题所困扰,那就是CMFCToolBar。向导创建的项目,运行得非常好,界面也很漂亮,还支持换肤,但是当应用程序添加第二个工具条时,问题就出现了。

我们添加第2个工具条的方法和示例代码中的一样,但出现了各种奇怪问题,症状表现为:

1.最大化时,两个工具条是连接在一起的,但是左侧工具条会自动移动一段距离;

2.重启应用程序,界面依然是混乱的;

3.重新启动程序,再退出后,偶尔有内存泄露,未正常释放的对象是工具套按钮对象,具体原因不详,跟踪后发现泄露发生在LoadState时。

如果退出程序后,把注册表中此工程相关项删除再启动程序,则界面正常,但是再重启后,问题依旧。

当我找到解决问题的办法时,才后悔没多看看SP1的Sample。以下是正确的创建第2个CMFCToolBar的方法,这里贴上缺省的m_wndToolBar的创建代码,以便进行比较。谢天谢地,这个问题还是解决了。由于时间有限,问题的原因到底出现在哪里,还不得而知,如果有朋友细细研究过,还望不吝赐教。

if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER |
CBRS_TOOLTIPS
| CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
!m_wndToolBar.LoadToolBar(theApp.m_bHiColorIcons ? IDR_MAINFRAME_256 : IDR_MAINFRAME))
{
TRACE0(
"未能创建工具栏\n");
return -1; // 未能创建
}if (!m_wndToolBarNew.Create(this, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS |
CBRS_FLYBY
| CBRS_SIZE_DYNAMIC,IDR_TOOLBAR1) ||
!m_wndToolBarNew.LoadToolBar( IDR_TOOLBAR1))
{
TRACE0(
"未能创建工具栏\n");
return -1; // 未能创建
}

SP1 Sample可以在以下位置找到:

X:\Program Files\Microsoft Visual Studio 9.0\Samples\AllVCLanguageSamples.zip

解压后的路径为:

AllVCLanguageSamples\C++\MFC\Visual C++ 2008 Feature Pack

也可以在这个位置下载到:

http://www.microsoft.com/downloads/details.aspx?familyid=9761BB57-F066-4B70-9318-3965C5E68AAD&displaylang=en

Keyword: Microsoft Visual C++ 2008 SP1 Sample Library

SP1下载地址:

http://msdn.microsoft.com/en-us/library/bb982354.aspx