Windows 7 中 C++/MFC 对话框的视觉风格?

Posted

技术标签:

【中文标题】Windows 7 中 C++/MFC 对话框的视觉风格?【英文标题】:Visual style of C++/MFC dialogs in Windows 7? 【发布时间】:2018-03-30 20:13:32 【问题描述】:

如何控制

“之前”图片显示了我想要的,直到大约一周前都是这种情况。现在,我的对话框出现在“之后”图片中,这不是我想要的。

如何控制使用哪种样式?我找不到任何清单文件,也找不到控制这个的 VS 编译器或链接器选项中的任何选项。我的项目是使用 MFC 作为静态库构建的,而不是 Unicode。它在 Windows 7 下运行。

64 位 Windows 7; Visual Studio 社区 15.6.4; Windows SDK 10.0.16299.0

【问题讨论】:

您的 "After" 屏幕截图启用了视觉样式,而 "Before" 没有。有几种方法可以enable visual styles,并显式或隐式禁用它们。 @Ilnspectable:我的理解是Before是“经典”风格的一个例子,After是另一种风格。我确实希望能够启用更改样式,但在源代码中,说明我想要哪种类型(即,之前或之后)。另一个令人困惑的地方是,直到最近,每次构建都出现 After 似乎无缘无故出现。 我发布了链接,以便您知道在您的项目中要寻找哪些更改。事情不会无缘无故地改变。 考虑使用 GIT 等版本控制软件来跟踪您对项目所做的所有更改。这将允许您“及时返回”并找到最后一个未显示错误的变更集。与下一个变更集进行比较,以缩小最有可能导致问题的变更。 不幸的是,更改可能是由于 VS 和/或解决方案目标的更改而发生的。据我所知,样式由 commctrl DLL 和 SetWindowTheme 控制,我没有更改这些。有人可以告诉我如何使用我展示的两个示例来控制视觉风格吗? 【参考方案1】:

在正常情况下,您的源代码中的某处有这个。对我来说,系统将它放在底部的stdafx.h 文件中:

如果您有这样的代码,那么它将具有视觉样式:

#pragma comment(linker,"/manifestdependency:\"type='win32' \
    name='Microsoft.Windows.Common-Controls' version='6.0.0.0' \
    processorArchitecture='*' publicKeyToken='6595b64144ccf1df' \
    language='*'\"")

如果您想关闭它,那么您问题的 cmets 中的 link 会告诉您如何:

您可以通过调用SetWindowTheme 函数来关闭窗口中某个控件或所有控件的视觉样式,如下所示:

SetWindowTheme(hwnd, L" ", L" ");

【讨论】:

编译指示可以出现在任何源文件中。也不需要预处理器条件。如果你去掉除了最后的 pragma 之外的所有东西,那么这就是你要找的东西。 _UNICODE 预处理器符号不相关。目前尚不清楚,为什么它会影响 Common Controls 版本 6 的使用。 @IInspectable:我在我的一个源文件中包含了最后一个编译指示,但我仍然得到了 After。对于我的情况,我想要之前。 @Andrew Truckle:我已经为几个单独的控件尝试过这个,它确实有效果,但结果与之前的不一样。当我给它主对话框的 m_hWnd 时,它对对话框的控件没有影响,尽管它确实会影响对话框窗口本身。 你尝试过做一个新项目吗?您应该说明您尝试过的内容,以便我们知道。 @AndrewTruckle:不,我没有尝试新项目。我只是问如何控制风格,无论是新的还是现有的。我已经尝试过这里的建议(清单和 SetWindowTheme)。【参考方案2】:

无需编程。您可以通过在兼容性设置中打开减少颜色模式来像以前一样恢复样式。 (右键-属性-兼容性),看看是否适合你。

【讨论】:

以上是关于Windows 7 中 C++/MFC 对话框的视觉风格?的主要内容,如果未能解决你的问题,请参考以下文章

将视觉样式应用于从 C# .net 程序调用的 MFC 对话框

MFC中关于自定义消息

使用MFC编制基于对话框的Windows应用程序,实现画图功能

捕获托管在 mfc 对话框上的 windows 窗体事件(c#)

Windows下命令行编译MFC工程

如何将 MFC 应用程序移植到 Windows Embedded Compact 7?