mfc 11 应用程序旧式按钮和进度条
Posted
技术标签:
【中文标题】mfc 11 应用程序旧式按钮和进度条【英文标题】:mfc 11 application old style buttons and progress bars 【发布时间】:2013-10-16 07:15:59 【问题描述】:我刚刚将一个 vs2010 mfc 应用程序更新到 vs2012,我遇到了新的闪亮样式窗口按钮和进度条没有出现的问题,它们显示为 Windows 2000 样式按钮。
我的 stdafx.h 文件中有以下代码:
#if defined _M_IX86
#pragma comment(linker,"/manifestdependency:\"type='win32'
name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"")
#elif defined _M_IA64
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='ia64' publicKeyToken='6595b64144ccf1df' language='*'\"")
#elif defined _M_X64
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='amd64' publicKeyToken='6595b64144ccf1df' language='*'\"")
#else
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")
#endif
我正在打电话给InitCommonControlsEx
,据我所知,我不需要清单文件来显示新样式。有什么想法吗?
【问题讨论】:
您确定清单已创建吗?正如您在代码中看到的那样,您有一个条件编译...通常定义了 _M_IX86 但是... 非常确定。代码#pragma 注释在该行上没有“变灰”,因此定义了 _M_IX86。将项目升级到 vs2012 时,我确实从非 unicode 更改为 unicode。这会在这里发挥作用吗? 我找到了解决办法。在我的项目设置中,平台工具集设置为“Visual Studio 2012 - Windows XP (v110_xp)”。我将其更改为“Visual Studio 2012 (v110)”,但只有在 exe 目录中放入声明<assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="x86" publicKeyToken="6595b64144ccf1df" language="*"></assemblyIdentity>
的清单文件后,才会为按钮和进度控件加载正确的样式。
【参考方案1】:
我玩游戏迟到了,但对我来说,问题在于一个名为 /ALLOWISOLATION
(description here) 的小型链接器设置。
此链接器设置必须设置为Yes
,否则甚至不会考虑清单。并且没有清单意味着将加载 v5.82 通用控件DLL
而不是 v6 版本。
如果这适用于您,您可以从调试器模块加载/卸载消息中看到(版本号与条目一起记录)。
奇怪的是,应用程序仍然出现“半主题”。例如。您可以循环浏览 XP 和 Office 主题,但例如按钮将没有任何现代样式。可能是不同的 DLL (uxtheme
?)。
图像列表中的图像也会出现锯齿状(即使图标严格为 32bpp,也没有 alpha 通道)。
【讨论】:
以上是关于mfc 11 应用程序旧式按钮和进度条的主要内容,如果未能解决你的问题,请参考以下文章
猎豹MFC--进度条CProgressCtrl 定时器SetTimer