#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.
С тех пор визуальные стили остались как функция. В 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);