Используя Window API, как я могу гарантировать, что элементы управления сохраняют собственный внешний вид? - PullRequest
4 голосов
/ 21 сентября 2008

Кажется, что некоторые из созданных мной элементов управления по умолчанию соответствуют старой теме Windows 95, как мне предотвратить это? Вот пример кнопки, которая не сохраняет внешний вид операционной системы (в качестве среды разработки я использую Vista):

HWND button = CreateWindowEx(NULL, L"BUTTON", L"OK", WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON,
                                  170, 340, 80, 25, hwnd, NULL, GetModuleHandle(NULL), NULL);

Я использую собственный C ++ с Windows API, без управляемого кода.

Ответы [ 2 ]

6 голосов
/ 22 сентября 2008

Чтобы добавить манифест в приложение, необходимо создать файл MyApp.manifest и добавить его в файл ресурсов приложения:

//-- This define is normally part of the SDK but define it if this 
//-- is an older version of the SDK.
#ifndef RT_MANIFEST
#define RT_MANIFEST              24
#endif

//-- Add the MyApp XP Manifest file
CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST "MyApp.manifest"

В более новых версиях Visual Studio имеется вкладка Инструмент манифеста , найденная в настройках проекта, и поле Дополнительные файлы манифеста , найденное на этой вкладке, также может использоваться для определения файла манифеста.

Вот простой файл MyApp.manifest для приложения Win32:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity
    version="1.0.0.1"
    processorArchitecture="X86"
    name="Microsoft.Windows.MyApp"
    type="win32"
/>
<description>MyApp</description>
</assembly>

Если ваше приложение зависит от других dll, эти данные также могут быть добавлены в манифест, и Windows будет использовать эту информацию, чтобы убедиться, что ваше приложение всегда использует правильные версии этих зависимых dll.

Например, вот подробные сведения о зависимости манифеста для библиотек времени исполнения Common Control и версии 8.0 C:

<dependentAssembly>
    <assemblyIdentity
        type="win32"
        name="Microsoft.Windows.Common-Controls"
        version="6.0.0.0"
        processorArchitecture="X86"
        publicKeyToken="6595b64144ccf1df"
        language="*"
    />
</dependentAssembly>
<dependentAssembly>
  <assemblyIdentity
        type="win32"
        name="Microsoft.VC80.CRT"
        version="8.0.50608.0"
        processorArchitecture="x86"
        publicKeyToken="1fc8b3b9a1e18e3b" />
</dependentAssembly>
4 голосов
/ 21 сентября 2008

Я полагаю, это не имеет никакого отношения к вашему коду, но вам нужно настроить правильный файл manifest , чтобы получить тематические элементы управления.

Некоторая информация здесь: @msdn.com и здесь: @blogs.msdn.com

Вы можете увидеть разницу между заявкой с и без манифеста здесь: heaventools.com

...