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

Posted

技术标签:

【中文标题】将视觉样式应用于从 C# .net 程序调用的 MFC 对话框【英文标题】:Applying visual styles to MFC dialogs called from a C# .net program 【发布时间】:2016-01-29 20:32:41 【问题描述】:

我有一个 .NET C# 程序,它引用了一些 C++/CLI dll,而这些 dll 又可以启动一些旧版 MFC 表单/对话框。但是,当这些对话框启动时,它们不会应用当前的 Windows 主题(即视觉样式)启动。它们以旧的 Windows 98 样式打开。

如果我们通过原始 C++/CLI 项目启动这些对话框,这些对话框确实会以视觉样式启动,而 pragma comment 包含在 Application Exe 项目的 stdafx.h 中。

我尝试了引用的 Microsoft 文章中关于将视觉样式应用于 C++ 项目的一些建议。但是它们都不起作用,因为我假设本文针对的是纯 C++ 解决方案,而不是引用旧 MFC 对话框的混合 C# 解决方案。

tl;dr 可以从 C# 程序启动 MFC 对话框,但对话框没有视觉样式。

【问题讨论】:

【参考方案1】:

“如果您希望您的应用程序使用视觉样式,您必须添加一个应用程序清单或编译器指令,指示如果可用,则应使用 ComCtl32.dll 版本 6。”

来源:https://msdn.microsoft.com/en-us/library/windows/desktop/bb773175(v=vs.85).aspx

应用程序清单应该可以工作。

【讨论】:

嗨,丹,感谢您的回复,但我已经尝试了应用程序清单。正如我在原帖中提到的那样,我去过那个链接并尝试了所有建议。当我添加应用程序清单时,我的 C# 应用程序无法编译。它抱怨这个错误:错误1找不到文件'Microsoft.Windows.Common-Controls,Version = 6.0.0.0,Culture = *,PublicKeyToken = 6595b64144ccf1df,ProcessorArchitecture = *,Type = win32'我找到的唯一解决方案是将其注释掉,这违背了将其添加到应用程序清单的目的。 所以将 ComCtl32.dll 版本 6 或更高版本添加到您的项目引用中。 (你运行的是什么版本的 Visual Studio,在什么版本的 Windows 上?)至少,你应该能够在你的可执行文件旁边放置一个独立的 XML 清单文件,与带有“.manifest”的可执行文件同名" 添加到末尾。

以上是关于将视觉样式应用于从 C# .net 程序调用的 MFC 对话框的主要内容,如果未能解决你的问题,请参考以下文章

如何在winform应用程序中添加Windows 7视觉样式?

Api 调用适用于从 Postman 获取的令牌,但不适用于通过 nodejs 应用程序获取的令牌

NI视觉库在.NET中的应用

将 C# 桌面应用程序移植到 Web

通过 C# .NET 应用程序调用时无法识别命令,但直接调用时有效

更改 MFC 应用程序的视觉样式 [重复]