Win32 API: Создать кнопку с эффектом Aero

Я могу создать кнопку с функцией CreateWindow, например

    CreateWindow(L"BUTTON", "Button label", WS_VISIBLE | WS_CHILD, 0, 0, 100, 25, parentWnd, ID, NULL, NULL);

Он работает отлично, но кнопка не имеет глянцевых эффектов, шрифт не имеет сглаживания.

Я также скомпилировал манифест:

<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
    <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>

Не уверен, какой токен использовать, взял образец с какого-то сайта. Затем я создал список ресурсов:

   CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST "manifest.xml"

Скомпилировано с:

   i686-w64-mingw32-windres -i resources.txt -OCOFF resources.res

И, наконец, связан с resources.res, но безрезультатно.

Когда я создал манифест и поместил его рядом с моим exe-файлом - все работает нормально. Но когда я пытаюсь скомпилировать манифест в ресурсы, у меня ничего не получается.

Как это исправить? Я предпочитаю не использовать какие-либо библиотеки, особенно такие большие, как Qt.


person bukkojot    schedule 13.09.2017    source источник
comment
Вы не связываете файл .rc, вы связываете файл .res   -  person David Heffernan    schedule 13.09.2017
comment
Эффект Aero или вы хотите, чтобы ваше приложение использовало новую тему в стиле Windows XP/Vista/7? если да, то вам придется использовать манифест приложения и инициализировать общие элементы управления.   -  person Asesh    schedule 13.09.2017
comment
Когда я создал манифест и поместил его рядом с моим exe-файлом, все работает нормально. Но когда я пытаюсь скомпилировать манифест в ресурсы, у меня ничего не получается.   -  person bukkojot    schedule 13.09.2017
comment
Вы делаете это неправильно. Вы не предоставили полную информацию, поэтому мы не можем сказать вам, что вы сделали не так.   -  person David Heffernan    schedule 13.09.2017
comment
@bukkojot вы связались с comctl32 и вызвали InitCommonControls? Обратитесь к этой странице: msdn. microsoft.com/en-us/library/windows/desktop/   -  person Asesh    schedule 13.09.2017


Ответы (1)


Изменить:
Убедитесь, что CREATEPROCESS_MANIFEST_RESOURCE_ID определяется как 1

Или замените строку манифеста следующим:

1 RT_MANIFEST "manifest.xml"

or

1 24 "manifest.xml"
person Barmak Shemirani    schedule 13.09.2017
comment
@bukkojot: это означает, что ваша среда разработки не определяет константы CREATEPROCESS_MANIFEST_RESOURCE_ID и/или RT_MANIFEST, поэтому в конечном итоге вы создадите ресурс с фактическим именем "CREATEPROCESS_MANIFEST_RESOURCE_ID" вместо идентификатора 1 и/или тип ресурса с фактическим именем "RT_MANIFEST" вместо типа 24. Используйте редактор/просмотрщик ресурсов, чтобы проверить - person Remy Lebeau; 13.09.2017
comment
Неверное решение. Лучше всего встроить ресурс. - person David Heffernan; 13.09.2017
comment
@DavidHeffernan Что ты имеешь в виду? Предполагается, что это встроенное ресурсное решение. Он должен работать без отдельного файла MYAPPNAME.exe.manifest, присутствующего в дистрибутиве. Если ОП не говорит иначе. - person Barmak Shemirani; 13.09.2017
comment
Нет, пользователь поместил этот xml-файл рядом с exe - person David Heffernan; 13.09.2017
comment
@DavidHeffernan Аскер уже знает о невстроенном решении. Смотрите исходный пост, где написано Когда я создал манифест и поместил его рядом с моим exe-файлом - все работает нормально. Но когда я пытаюсь скомпилировать манифест в ресурсы, у меня ничего не получается Весь вопрос во встроенном решении. - person Barmak Shemirani; 14.09.2017
comment
Итак, вы можете объяснить, что было не так и как ваш ответ исправляет это. - person David Heffernan; 14.09.2017
comment
@DavidHeffernan Я думаю, единственная проблема заключалась в том, что CREATEPROCESS_MANIFEST_RESOURCE_ID не было объявлено как 1. Я попробовал это на CodeBlock с MinGW, это работает. Иногда я добавляю в свой пост суеверия, которые на самом деле не имеют смысла. Я удалил ту часть. - person Barmak Shemirani; 14.09.2017