Программирование в C Win API: как заставить Windows 7 искать элементы управления?

#c #windows #winapi #button #visual-styles

#c #Windows #winapi #кнопка #визуальные стили

Вопрос:

Я программирую строго на C и WinAPI, без C или C #. Я новичок и только учусь рисовать элементы управления и т.д. Дело в том, что когда я создаю окна или другие элементы управления, такие как командные кнопки, они имеют собственный вид Windows. Взгляните на это:

Вот что я получаю!

Но в Windows 7 командные кнопки выглядят следующим образом:

введите описание изображения здесь

Теперь, как мне заставить командные кнопки в моей программе выглядеть подобным образом. Возможно ли это вообще? Я следую этому руководству для справки:http://zetcode.com/gui/winapi /

Спасибо.

Ответ №1:

Именно так выглядели элементы управления в 1990-х годах, до изобретения тем (визуальных стилей). Как вы заметили, современные кнопки теперь раскрашены в причудливые цвета с градиентами, пульсацией и все такое. Но по соображениям обратной совместимости вы должны специально запросить, чтобы ваши элементы управления получили такую обработку, иначе они вернутся к устаревшему стилю.

Вы делаете это, указывая манифест. Вы можете либо добавить элемент управления в обычном текстовом формате в корневой каталог вашего приложения, либо заставить Visual Studio (2005 и более поздние версии) автоматически встроить его в ваш EXE-файл.

Я бы пошел вторым путем. Добавьте следующий код в свой stdafx.h файл, чтобы сообщить компилятору, что вы хотите, чтобы он автоматически добавлял манифест при сборке вашего проекта:

 #if defined _M_IX86
#pragma comment(linker,"/manifestdependency:"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'"")
#elif defined _M_IA64
#pragma comment(linker,"/manifestdependency:"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='ia64' publicKeyToken='6595b64144ccf1df' language='*'"")
#elif defined _M_X64
#pragma comment(linker,"/manifestdependency:"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='amd64' publicKeyToken='6595b64144ccf1df' language='*'"")
#else
#pragma comment(linker,"/manifestdependency:"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'"")
#endif
  

В этой статье MSDN содержится больше информации о визуальных стилях, чем вы могли бы когда-либо пожелать.

И если вы действительно хотите, чтобы ваше приложение выглядело как родное, вам нужно изменить кисть фона, используемую для главного окна. По умолчанию он настроен на использование того же цвета, что и фон текстового поля (белый).

Вместо этого вы хотите использовать цвет, используемый для рисования 3D-элементов управления. Измените hbrBackground элемент вашей WNDCLASS (или WNDCLASSEX ) структуры, как показано здесь:

 wc.hbrBackground = (HBRUSH)(COLOR_BTNFACE   1);
  

Почему вы должны добавить 1? Опять же, по соображениям обратной совместимости. Подробности скучны. 🙂

Комментарии:

1. Спасибо за ответ! 🙂 Я не включаю stdafx.h, поэтому я просто перешел через manifest. Ваш совет о цветах был действительно полезен! Только что исправлен белый цвет фона!

2. @Ishan: На самом деле вы можете поместить этот код куда угодно, stdafx.h это было просто предложение, потому что оно включено в шаблоны по умолчанию. Он используется для предварительно скомпилированных заголовков, к чему вы, вероятно, захотите привыкнуть, если собираетесь создавать какие-либо нетривиальные приложения в будущем. И код просто сообщает компилятору автоматически создать и вставить манифест. Все дело в этом манифесте. Рад, что вы смогли разобраться в этом!

Ответ №2:

Вы включаете визуальные стили для своего приложения, предоставляя XML-манифест либо в виде отдельного файла, либо в виде встроенного ресурса. Подробности см. в разделе Включение визуальных стилей.

Комментарии:

1. Большое спасибо за быстрый ответ! Теперь мое приложение выглядит именно так, как я хочу.

Ответ №3:

Вы, наверное, помните, когда появилась Windows XP с этим новым внешним видом, и вы могли вернуть ей классический внешний вид Windows 95/2000 или вы могли изменить цветовую тему. Это называлось «визуальные стили«, что позволило улучшить поддержку тематизации в Windows.

Classic, Luna, Aero и Metro

С тех пор визуальные стили остались как функция. В Windows Vista и 7 появился Aero, но они по-прежнему разрешали использовать классическую тему. В Windows 8 удалены как Aero, так и классическая тема, и добавлена тема Metro. Высококонтрастные темы теперь являются частью визуальных стилей и больше не имеют классического внешнего вида.

Таким образом, классическое тематическое приложение в Windows 7, от которого ожидался стиль Aero, является проблемой с визуальным стилем приложения. Я не уверен, почему, но Microsoft не оставила старую классическую тему необязательной при переносе API в новый вид.

Итак, как мне применить современный стиль?

введите описание изображения здесь

В любом случае, в этой статье MSDN объясняется, как включить визуальные стили для вашего приложения. Я видел людей, говорящих, что включение Unicode (определение UNICODE ) сделало бы это, но это не обязательно. По сути, вам просто нужно написать файл манифеста, указывающий версию 6 библиотеки DLL common controls в качестве требования, затем внедрить его в качестве ресурса или поместить под appname.exe.manifest в каталог исполняемого файла. Пример манифеста будет выглядеть следующим образом:

 <?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.0" processorArchitecture="*"
        name="CompanyName.ProductName.YourApplication" type="win32"/>
    <description>Your application description here.</description>
    <dependency>
        <dependentAssembly>
            <assemblyIdentity name="Microsoft.Windows.Common-Controls"
                version="6.0.0.0" type="win32" processorArchitecture="*"
                publicKeyToken="6595b64144ccf1df" language="*"/>
        </dependentAssembly>
    </dependency>
</assembly>
  

Если вы выберете опцию встраивания, не забудьте winuser.h включить ее в свой файл ресурсов. Вы также можете инициализировать библиотеку DLL common controls в вашем WinMain , в соответствии с этим руководством MinGW:

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

 INITCOMMONCONTROLSEX icc;
icc.dwSize = sizeof(icc);
icc.dwICC = ICC_WIN95_CLASSES;
InitCommonControlsEx(amp;icc);