c++ - 组框外观

标签 c++ c windows winapi

我使用的是 Visual Studio 2008 专业版。我在对话框编辑器中设计了以下对话框: Dialog that I designed

请密切注意名为“任务”的对话框中的组框。它在这里看起来不错,但是当我将它显示为应用程序中的无模式对话框时,该 GroupBox 的外观和感觉突然变为 -: Dialog box when displayed from application

突然之间,对话框编辑器中指定的原始蓝色标题和圆角边缘消失了,取而代之的是黑色前景和方形边缘。 我想知道为什么会突然发生这种情况,我希望它以对话框编辑器中指定的外观显示。

以下代码存在于我的对话框资源文件 (Timer.rc) 中:

IDD_FORMVIEW DIALOGEX 0, 0, 204, 118
STYLE DS_ABSALIGN | DS_SETFONT | DS_SETFOREGROUND | DS_CENTER | WS_MINIMIZEBOX | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
EXSTYLE WS_EX_APPWINDOW | WS_EX_NOACTIVATE
CAPTION "SR-Timer(Work in Progress)"
FONT 10, "Verdana", 400, 0, 0x0
BEGIN
    CONTROL         "Shutdown",IDC_RADIO1,"Button",BS_AUTORADIOBUTTON,73,37,48,10
    CONTROL         "Restart",IDC_RADIO2,"Button",BS_AUTORADIOBUTTON,73,54,39,10
    CONTROL         "Stand By",IDC_RADIO3,"Button",BS_AUTORADIOBUTTON,73,70,44,10
    CONTROL         "Hibernate",IDC_RADIO4,"Button",BS_AUTORADIOBUTTON,73,87,47,10
    GROUPBOX        "Tasks",IDC_STATIC,59,28,90,78
END

提前致谢。

最佳答案

您应该启用 XP 通用控件样式。

最简单的方法是将其包含在您的 list 文件中,例如通过将它添加到链接器,或在您的代码中添加编译指示,如下所示:

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

编辑:可能还需要显式初始化公共(public)控件(不是 100% 确定),如下所示:

INITCOMMONCONTROLSEX    InitStr;
InitStr.dwSize = sizeof(InitStr);
InitStr.dwICC  = ICC_WIN95_CLASSES|ICC_DATE_CLASSES|ICC_COOL_CLASSES;
// Other classes are: ICC_COOL_CLASSES, ICC_INTERNET_CLASSES, ICC_PAGESCROLLER_CLASS, ICC_USEREX_CLASSES
InitCommonControlsEx(&InitStr);

可能还需要使用正确的 Windows 版本定义进行编译。我使用这些命令行选项进行编译:

/D_WIN32_WINNT#0x0501 /DWINVER#0x0501 /D_WIN32_IE#0x0500

但这总是意味着应用程序至少需要 Windows XP。

EDIT2(作为对 sreyan 评论的回答):

我尝试编译以下源文件(称为 test.cpp):

#include <iostream>

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

void main()
{
std::cout << "Hello World" << std::endl;
}

使用以下命令:

cl /EHsc /MD /c test.cpp
link test.obj

生成了以下文件:

23-04-12  10:49             9 728 test.exe
23-04-12  10:49               638 test.exe.manifest
23-04-12  10:49            16 812 test.obj

test.exe.manifest 文件包含以下内容:

<?xml version='1.0' encoding='UTF-8' standalone='yes'?>
<assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'>
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
    <security>
      <requestedPrivileges>
        <requestedExecutionLevel level='asInvoker' uiAccess='false' />
      </requestedPrivileges>
    </security>
  </trustInfo>
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*' />
    </dependentAssembly>
  </dependency>
</assembly>

所以这似乎工作正常。

重新检查您在 Visual Studio 中填写的选项,以及您添加的编译指示。 首先尝试使用一个小应用程序(如上面的那个),直到你让它正常工作。 然后继续你的大应用程序。如果不行,再对比一下和小程序有什么不同。

成功。

关于c++ - 组框外观,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10207368/

相关文章:

c++ - 有理由不使用固定宽度类型吗?

c++ - 跨 COM 边界传递 CComSafeArray

C++:在 Visual Studio 中处理每个可变参数

c - 将函数内和函数外的矩阵声明为全局矩阵

c - 如何使用 C 递归地计算字符串中非空白字符的数量?

php - Xdebug 探查器不工作?

linux - Visual Studio 2017 crlf/lf

c++ - LNK2019 在 Qtcreator 上实例化对象 c++ 时

c - 针对特定场景最好的Linux内核锁定机制是什么

windows - 如何将 Windows 应用程序与特定文件类型相关联,但与其他应用程序共享该关联?