【问题标题】:Upgrading from VS2010 to VS2013 has lost the visual styles从 VS2010 升级到 VS2013 失去了视觉风格
【发布时间】:2017-04-08 18:46:04
【问题描述】:

我已从 Visual Studio 2010 升级到 Visual Studio 2013。

我也安装了Multibyte MFC Library for Visual Studio 2013

自升级以来,视觉样式不再适用于在 MFC 对话框中创建的控件。

我会指出,Visual Studio 半正确地预览(渲染)它(错误的背景,但通常是正确的控件),只有在运行时(调试或发布等)才会发生这种奇怪的变化。

我在当前的解决方案中添加了一个新的 MFC 应用程序。当我调试这个 MFC 应用程序时,它会使用视觉样式呈现。

编辑

我已遵循How to enable visual styles without a manifest 中的建议

这意味着,在 MFC 项目中,我有一个 stdafx.h。由于我使用的是 VS2005 之后的版本(并且由于没有清单文件),所以我在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_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

编辑

如果重要的话,这个项目的默认字符集设置为Use Multi-Byte Character Set

编辑

此项目没有清单文件。它是嵌入的。

编辑

比较 VS2010 构建和 VS2013 构建的 .exe 文件(用记事本打开)显示相同的清单文件,但有 1 个异常

VS2010

<ms_windowsSettings:dpiAware xmlns:ms_windowsSettings="http://schemas.microsoft.com/SMI/2005/WindowsSettings" xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</ms_windowsSettings:dpiAware>

VS2013

<dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware>

但是,我看不出 DPI 会如何影响这一点。

编辑

我刚刚意识到这个解决方案中有另一个项目也使用 MFC 对话框。同样的问题也存在。

更新

我已确保新 MFC 项目和我的 C++ 项目之间的项目设置相同(不同之处在于 MFC 导出到应用程序,而我将项目导出到 .dll)

我已确保我的项目中的 stafx.h 与新的 MFC 项目相同(不同之处在于我的 C++ 项目需要包含 ActiveX 控件)

请注意,清单是嵌入的,并且是通过属性窗格创建的。没有手动配置的 xml 文件。

【问题讨论】:

  • 您的清单文件似乎有问题。
  • 请注意,如果您要使用 #pragma comment 嵌入清单,则必须从项目中删除清单文件
  • 也请在CWinApp::InitInstance() 中发布您拥有的内容以初始化常用控件。
  • @AndrewKomiagin,这个项目没有清单文件。我已经在计算机上搜索了 .manifest 并且与该项目没有任何关系(主项目有一个,但它不包含有关样式的任何详细信息(它用于我们有 ActiveX 控件并希望覆盖注册表调用)。请注意,MFC 是我们 C++ 项目的一部分,没有实际的 MFC 项目,只有 MFC 代码,因此没有 CWinApp()::InitInstance()

标签: visual-studio-2010 visual-studio-2013 mfc


【解决方案1】:

很难猜测项目转换中可能出了什么问题。或者就此而言,您如何确保在 VS2010 中为程序生成了正确的清单。你真的需要在你的问题中解决这个细节。

对此稍加考虑,这些天来确保 EXE 文件具有良好的清单非常重要。不仅对启用视觉样式很重要,它还声明程序与 UAC 兼容。该清单应始终作为资源嵌入,而不是作为单独的文件部署。由链接器完成。您添加的#pragmas 只能在链接器嵌入清单时起作用。

您可以使用 File > Open > File > 从构建目录中选择 EXE 来仔细检查此清单是否正确嵌入。尝试使用 c:\windows\notepad.exe 进行比较。您应该看到 RT_MANIFEST 节点,打开它以查看资源 ID #1。您可以双击它来查看内容,但这会产生难以阅读的十六进制转储。另一种方法是右键单击它 > 导出 > 保存到扩展名为 .txt 的文件,然后在文本编辑器中打开它。

并且您需要检查项目的构建选项以确保启用清单生成。最好通过再次启动 VS 并使用向导创建一个新的 MFC 项目来做到这一点,允许您将已知良好的设置与项目的设置进行比较。您要比较的位于 Linker > Manifest File and Manifest Tool > all settings。

【讨论】:

  • 感谢您的 cmets。我已经经历了这一切,并相信尝试了一切(并更新了我的 OP)。可悲的是,似乎一切正常 - 清单文件是相同的。 .stdafx.h 和 .cpp 文件是相同的(比较我的 VS2013 和我的 VS2010)。我创建了一个新的 MFC 项目并更改了属性以匹配我的 VS2013 项目设置,但 MFC 仍然显示视觉样式...
猜你喜欢
  • 2014-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-17
  • 2011-01-16
  • 1970-01-01
相关资源
最近更新 更多