我使用winapi编程GUI,但我的应用程序看起来像Windows 98主题。 如何使用当前窗口主题?
我尝试创建一个清单文件,但它不起作用。
Test.cpp的
# include <windows.h>
int WINAPI WinMain(
HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow
){
MessageBox(NULL, "Hello World!", "Hello", MB_OK);
return 0;
}
Test.exe.Manifest
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly
xmlns="urn:schemas-microsoft-com:asm.v1"
manifestVersion="1.0">
<assemblyIdentity
name="App.Win.Test"
processorArchitecture="x86"
version="1.0.0.0"
type="win32"/>
<description>Test</description>
<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="Microsoft.Windows.Common-Controls"
version="6.0.0.0"
processorArchitecture="x86"
publicKeyToken="6595b64144ccf1df"
language="*"
/>
</dependentAssembly>
</dependency>
</assembly>
Manifest.rc
1 24 "Test.exe.Manifest"
我在Windows XP SP3上使用MinGW编译器编译。
g++ Test.cpp -c
windres Manifest.rc -O coff -o Manifest.res
g++ Test.o Manifest.res -o Test.exe -Wl,-subsystem,windows
但是当我运行可执行文件时,它会关闭。没有清单和资源文件,它可以工作,但使用Windows 98主题。
由于
编辑:
谢谢,现在可以了。
我从教程中复制了清单fie,但我没有调用InitCommonControls()。
InitCommonControls()有效。
我必须编辑我的commctrl.h,因为InitCommonControlsEx()在那里被禁用,现在可以正常工作。
链接器命令已更改:
g++ Test.o Manifest.res -o Test.exe -Wl,-subsystem,windows -lcomctl32
答案 0 :(得分:2)
在调用MessageBox
之前尝试此代码INITCOMMONCONTROLSEX iccx = { sizeof(INITCOMMONCONTROLSEX), ICC_COOL_CLASSES | ICC_BAR_CLASSES};
::InitCommonControlsEx(&iccx);
答案 1 :(得分:1)
您的MinGW安装是最新的吗?不再使用XP但在Win7上试用,消息框使用Vista / 7样式(右下角的“确定”按钮,白色/灰色背景等)。
您不必提供任何编译器开关,只需运行g++ test.cpp -o test.exe
即可在Windows下创建Win32可执行文件。
但是我还记得在使用Visual Basic 6时遇到类似问题。我认为你必须在你的应用程序中初始化通用控件(抱歉,现在不记得这个调用)。如果您不这样做,强制它通过清单文件将导致崩溃。我不是100%肯定这个,多年......但我会先尝试查找。同样出于测试目的,您不必在可执行文件中包含清单。只需将它作为“test.exe.manifest”放在它旁边 - 它也可以正常工作,并允许您使用/不使用清单文件进行测试而无需重新编译。
编辑:请参阅DreJ的答案 - 这也是我所指的电话。
答案 2 :(得分:0)
有关MSDN
的有用指南在这个特定的实例中,您似乎没有链接到comctl32.lib,并且您没有调用InitCommonControls或InitCommonControlsEx来准备新的视觉样式以供使用。