【问题标题】: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 像素边框。如何在这两种样式之间启用/禁用?

这是这两种样式的示例,我想使用上面的样式:

【问题讨论】:

    标签: c++ visual-studio-2008 visual-c++ windows-xp


    【解决方案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
    猜你喜欢
    • 2018-12-05
    • 1970-01-01
    • 1970-01-01
    • 2014-10-15
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多