1

我对影响 Windows 对话框中 UI 元素(如按钮)外观的因素有些困惑。我的困惑来自以下观察:

1-我的系统上安装了 Visual Studio 2010,当我创建 MFC 对话框时,.rc 上的按钮具有精致的外观,略微圆角等。当我构建 MFC 应用程序时,生成的 exe 中出现相同的外观。 与win7上的2010项目

2-现在我得到一个在 VC 6 中开发的应用程序,将其转换为新的 vs 2010 项目。当我打开 .rc 文件时,UI 外观与上述相同

转换后项目的rc文件

但是当我构建和运行应用程序时,按钮的 ui 外观是旧的,简单的。 查看转换后项目的运行 exe

3-我在旧代码中包含 InitcommonControlEx() ,但这并没有改变。也许它与此无关。

我的问题是什么在控制 ui 元素的这种外观和感觉?它与指示应用程序应使用哪个版本的 Windows 库的清单文件有关吗?

如果是这样,如何更新旧项目的清单文件,以便获得新的 UI 外观?

4

3 回答 3

1

你说的对。您需要嵌入清单文件。

使用 VS2010 将 manifest 嵌入到 MFC 应用程序中的正确方法是通过 Properties->Linker->Manifest File->Generate Manifest。要启用 XP 主题,只需在该Additional Manifest Dependencies字段中使用以下内容:

type='Win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='X86' publicKeyToken='6595b64144ccf1df' language='*'
于 2013-04-15T02:33:30.393 回答
1

在 VS2010 中,使用 New Project 向导创建一个 MFC 对话框应用程序(实际上任何 MFC 应用程序都可以)。为所有选项选择默认值并让向导生成代码。

完成后,查看文件stdafx.h并将以下块复制/粘贴到您的stdafx.h

#ifdef _UNICODE
#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
#endif

您也可以通过 Project/Properties 执行此操作,但通过在代码中执行此操作,如果您与其他项目共享源代码,它不会中断。

请注意,其中有一个#ifdef _UNICODE,因为少量通用控件仅适用于 UNICODE 构建。但是,如果您需要非 UNICODE 构建并且仅使用“标准”Windows 控件(例如,没有列表视图或树视图等),则可以删除#ifdef.

于 2013-04-15T04:49:51.517 回答
1

如果您不想删除 #ifdef _UNICODE 语句,您可以复制该行

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

并将其放在 stdafx.h 文件的末尾。这与上面“ cha ”推荐的步骤完全相同,但步骤更少。

于 2013-05-22T00:27:42.993 回答