C++ 组合框外观和感觉

C++ 组合框外观和感觉,c++,c,windows,winapi,C++,C,Windows,Winapi,我使用的是VisualStudio2008专业版。我在对话框编辑器中设计了以下对话框-: 请密切注意“任务”对话框中的“组”框。这里看起来不错,但当我从应用程序中将其显示为非模态对话框时,该GroupBox的外观突然变为-: 突然,对话框编辑器中指定的原始蓝色标题和圆形边消失了,并替换为黑色前景和方形边我想知道为什么会突然发生这种情况,我想让它以对话框编辑器中指定的外观显示。 对话框的资源文件(Timer.rc)中存在以下代码-: IDD_FORMVIEW DIALOGEX 0, 0, 20

我使用的是VisualStudio2008专业版。我在对话框编辑器中设计了以下对话框-:

请密切注意“任务”对话框中的“组”框。这里看起来不错,但当我从应用程序中将其显示为非模态对话框时,该GroupBox的外观突然变为-:

突然,对话框编辑器中指定的原始蓝色标题和圆形边消失了,并替换为黑色前景和方形边我想知道为什么会突然发生这种情况,我想让它以对话框编辑器中指定的外观显示。

对话框的资源文件(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

提前感谢。

显然,这需要清单和/或调用
InitCommonControls()
。有关更多信息,请参阅。

显然,这需要清单和/或调用
InitCommonControls()
。有关更多信息,请参阅。

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

最简单的方法是将其包含在清单文件中,例如,将其添加到链接器,或在代码中添加pragma,如下所示:

#pragma comment(linker,"\"/manifestdependency:type='win32' \
name='Microsoft.Windows.Common-Controls' version='6.0.0.0' \
processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")
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);
编辑:可能还需要显式初始化常用控件(不是100%确定),如下所示:

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

生成了以下文件:

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>

因此,这似乎是正确的工作

重新检查您在VisualStudio中填写的选项以及您添加的pragma。 首先尝试使用一个小应用程序(如上面的一个),直到它正常工作。 然后转到您的大型应用程序。如果不起作用,比较一下小应用的不同之处


成功。

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

最简单的方法是将其包含在清单文件中,例如,将其添加到链接器,或在代码中添加pragma,如下所示:

#pragma comment(linker,"\"/manifestdependency:type='win32' \
name='Microsoft.Windows.Common-Controls' version='6.0.0.0' \
processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")
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);
编辑:可能还需要显式初始化常用控件(不是100%确定),如下所示:

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

生成了以下文件:

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>

因此,这似乎是正确的工作

重新检查您在VisualStudio中填写的选项以及您添加的pragma。 首先尝试使用一个小应用程序(如上面的一个),直到它正常工作。 然后转到您的大型应用程序。如果不起作用,比较一下小应用的不同之处


成功。

单选按钮中也没有视觉样式,您可以很容易地看到。单选按钮中也没有视觉样式的可能副本,您可以很容易地看到。可能的副本不起作用。我以以下方式粘贴了代码-:#include#include“resource.h”#pragma comment(linker,“\”/manifestdependency:type='win32'\name='Microsoft.Windows.Common Controls'version='6.0.0.0'\processorArchitecture='publicKeyToken='6595b64144ccf1df'language=''\'')LRESULT回调WindowFunc(HWND、UINT、WPARAM、LPARAM);BOOL回调对话框func(HWND、UINT、WPARAM、LPARAM);char szWinName[]=“计时器主窗口”;int WINAPI WinMain(HINSTANCE HTHIINST、HINSTANCE hPrevInst、LPSTR lpszArgs、int nWinMode)。。。我遗漏了什么吗???谢谢你提供的信息,但我需要我的应用程序运行在Win2000及以上。顺便问一下,你给的#pragma注释和命令行选项的含义是什么即使我不明白,无意冒犯,我只是对Win32 API不熟悉,我想知道。pragma告诉编译器在生成的.OBJ文件的某个地方添加文本(用于链接器)。链接器将从.OBJ文件中获取此信息,并将文本用作附加命令行选项(您可以使用此技巧向链接器添加任何选项)。/manifestdependency选项告诉链接器将此依赖项添加到生成的清单文件中(请参阅)。最后,您可以使用清单工具将清单作为可执行文件中的资源进行索引(请参阅)。还包含有关此的详细说明。/manifestdependency:type='win32'name='Microsoft.Windows.Common Controls'version='6.0.0.0'processorArchitecture=''publicKeyToken='6595b64144ccf1df'language=''“”)我已经从属性页面将上述行添加到链接器区域的附加清单依赖项部分。但我得到的错误是无法生成清单文件\Debug\Timer.exe.intermediate.manifest:一般错误c1010070:未能加载和分析清单。我知道我遗漏了一些东西,是否有一个完整的项目,我可以参考??这不起作用。我以以下方式粘贴了代码-:#include#include“resource.h”#pragma comment(linker,“\”/manifestdependency:type='win32'\name='Microsoft.Windows.Common Controls'version='6.0.0.0'\processorArchitecture='publicKeyToken='6595b64144ccf1df'language=''\'')LRESULT回调WindowFunc(HWND、UINT、WPARAM、LPARAM);BOOL回调对话框func(HWND、UINT、WPARAM、LPARAM);char szWinName[]=“计时器主窗口”;int WINAPI WinMain(HIN