什么因素控制对话框按钮外观?

时间:2013-04-14 05:53:18

标签: user-interface mfc win32gui

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

1-我在我的系统上安装了visual studio 2010,当我创建一个MFC对话框时,.rc上的按钮具有复杂的外观,略微圆角等。当我构建MFC应用程序时,相同的外观出现在结果中可执行程序。 vs 2010 project on win7

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

rc file of the converted project

但是当我构建并运行应用程序时,按钮的ui外观很旧,不够复杂。 look in the running exe of the converted project

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

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

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

3 个答案:

答案 0 :(得分:1)

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

使用VS2010将清单嵌入到MFC应用程序中的proper方法是通过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='*'

答案 1 :(得分:1)

在VS2010中,使用“新建项目”向导创建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

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

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

答案 2 :(得分: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”推荐的步骤完全相同,但步骤更少。