如何在Windows上使用默认GUI主题?

时间:2010-12-09 21:47:13

标签: windows winapi user-interface themes

我使用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

3 个答案:

答案 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来准备新的视觉样式以供使用。