Как использовать стандартную тему графического интерфейса в Windows? - PullRequest
0 голосов
/ 10 декабря 2010

Я программирую графический интерфейс с winapi, но мое приложение выглядит как тема 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"

Я скомпилировал с помощью компилятора MinGW в Windows XP SP3.

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.

Спасибо


Edit:

Спасибо, теперь все работает.

Я скопировал файл манифеста из учебника и не вызывал InitCommonControls ().

InitCommonControls () работает.

Мне пришлось отредактировать свой commctrl.h, потому что там было отключено InitCommonControlsEx (), и теперь оно работает.

Команда компоновщика изменена:

g++ Test.o Manifest.res -o Test.exe -Wl,-subsystem,windows -lcomctl32

Ответы [ 3 ]

2 голосов
/ 10 декабря 2010

Попробуйте этот код перед вызовом MessageBox

INITCOMMONCONTROLSEX iccx = { sizeof(INITCOMMONCONTROLSEX), ICC_COOL_CLASSES | ICC_BAR_CLASSES};
::InitCommonControlsEx(&iccx);
1 голос
/ 10 декабря 2010

Ваша установка MinGW актуальна? У вас больше нет XP, но вы пробовали Win7, и в окне сообщений используется стиль Vista / 7 (кнопка «ОК» в правом нижнем углу, белый / серый фон и т. Д.).

Вам не нужно указывать какие-либо параметры компилятора, достаточно просто запустить g++ test.cpp -o test.exe для создания исполняемого файла Win32 под Windows.

Однако я помню, что у меня были похожие проблемы при работе с Visual Basic 6. Я думаю, что вам нужно инициировать общие элементы управления внутри вашего приложения (извините, не помню сейчас вызов). Если вы этого не сделаете, принудительное использование файла манифеста приведет к сбою. Я не уверен на 100% в этом, прошли годы ... но я бы попробовал поискать это первым. Также в целях тестирования вам не нужно включать манифест в ваш исполняемый файл. Просто поместите его рядом с ним как «test.exe.manifest» - он также должен работать и позволяет тестировать с / без файла манифеста без перекомпиляции.

Редактировать: см. Ответ DreJ - это звонок, который я тоже повторял.

0 голосов
/ 10 декабря 2010

Есть полезное руководство по MSDN

В данном конкретном случае кажется, что вы не ссылаетесь на comctl32.lib и не вызываете InitCommonControls или InitCommonControlsEx для подготовки новых визуальных стилей для использования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...