如何将对话框项的样式更改为测试模式下出现的样式?
Posted
技术标签:
【中文标题】如何将对话框项的样式更改为测试模式下出现的样式?【英文标题】:How to change the style of dialog box items into what appears in test mode? 【发布时间】:2012-03-28 22:45:01 【问题描述】:当我在 Visual Studio 2008 中通过 CTRL+T 快捷键测试我的对话框时,我可以看到带有整齐光滑边框的对话框项目。但是当我编译项目并通过程序本身启动它时,它看起来像“3d”风格:每个对话框都有像旧的 Windows 98 风格的阴影。
我想使用测试模式显示的光滑的 1 像素边框。如何在这两种样式之间启用/禁用?
这是这两种样式的示例,我想使用上面的样式:
【问题讨论】:
【参考方案1】:您需要启用 ComCtl32 版本 6,以便将正确的视觉样式应用于控件。 Microsoft 在此链接中提供了完整说明:Enabling Visual Styles
【讨论】:
我尝试使用#pragma 方法,但它没有做任何事情,有什么想法吗? @Rookie,这本身是不够的,您还必须在程序启动时调用InitCommonControls
。我建议阅读整篇文章。
我链接到 ComCtl32.lib 并调用 InitCommonControls() 但没有什么不同。我不知道还能做什么......它说我不需要使用这种方法的清单,但它不起作用。
@Rookie,我的错误 - 你必须调用 InitCommonControlsEx,而不是 InitCommonControls。
我认为我不需要那个 Ex 版本,因为我没有使用这些类。无论如何,我试过了,但无法让它工作,无论我在 LPINITCOMMONCONTROLSEX 中输入什么,它都会崩溃。奇怪的是编译器抱怨我没有得到的未初始化变量。这是我的代码:LPINITCOMMONCONTROLSEX a; a->dwSize = sizeof(INITCOMMONCONTROLSEX); a->dwICC = 0xFFFFFFFF; InitCommonControlsEx(a);
,当它没有崩溃时,init func 返回 false。【参考方案2】:
STEP1 将此代码添加到您的 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_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
方法 InitInstance() 的第 2 步:
BOOL Ctest_stylesApp::InitInstance()
INITCOMMONCONTROLSEX InitCtrls;
InitCtrls.dwSize = sizeof(InitCtrls);
InitCtrls.dwICC = ICC_WIN95_CLASSES;
InitCommonControlsEx(&InitCtrls);
我使用的是 Visual Studio 2010,它可以工作。
【讨论】:
嗯,我得到了它,但我不得不删除#ifdef _UNICODE
。我不确定为什么会有那行代码,但是没有它它就可以工作。谢谢! (我需要等待 19 小时才能提供 +50 赏金)。
#ifdef _UNICODE
的原因是新的(第 6 版)通用控件库仅适用于 UNICODE。它没有 ASCII 版本
如果 WIN32_LEAN_AND_MEAN
已定义且 commctrl 不是预编译头文件的一部分或尚未在任何地方提及,您还需要 #include <CommCtrl.h>
以不同的方式命名库,comctl32.lib以上是关于如何将对话框项的样式更改为测试模式下出现的样式?的主要内容,如果未能解决你的问题,请参考以下文章