Ответ 1
Вы включаете визуальные стили для своего приложения, предоставляя манифест XML, либо как отдельный файл, либо как встроенный ресурс. Подробнее см. Включение визуальных стилей.
Я программирую строго в C и WinAPI, не С++ или С#. Я новичок и просто научился рисовать элементы управления и т.д. Дело в том, что когда я создаю Windows или другие элементы управления, такие как Command Buttons, они имеют внешний вид Windows. Взгляните на это:
Но в Windows 7 кнопки команд выглядят следующим образом:
Теперь, как мне получить командные кнопки в моей программе, чтобы выглядеть так. Возможно ли это? Я следую этому руководству, для справки: http://zetcode.com/gui/winapi/
Спасибо.
Вы включаете визуальные стили для своего приложения, предоставляя манифест XML, либо как отдельный файл, либо как встроенный ресурс. Подробнее см. Включение визуальных стилей.
То, как элементы управления смотрели еще в 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? По соображениям обратной совместимости снова. Детали скучны.: -)
Вероятно, вы помните, когда Windows XP появилась с новым новым взглядом, и вы можете вернуть его обратно к классическому внешнему виду Windows 95/2000 или изменить цветную тему. Это было вызвано визуальные стили, которые принесли Windows более точную поддержку.
Визуальные стили оставались как функция с тех пор. Windows Vista и 7 представили Aero, но они все же разрешили использовать классическую тему. Windows 8 удалила и Aero, и классическую тему, и добавила тему Metro. Высококонтрастные темы теперь являются частью визуальных стилей и больше не имеют классического внешнего вида.
Таким образом, классическое тематическое приложение в Windows 7, когда ожидалось, стиль Aero, является проблемой с визуальным стилем приложения. Я не знаю, почему, но Microsoft не оставила старую классическую тему опциональной при переносе API на новый внешний вид.
Итак, как применить современный стиль?
В любом случае эта статья MSDN объясняет, как включить визуальные стили для вашего приложения. Я видел, как люди говорили, что включение Unicode (определение UNICODE
) сделает это, но это не требуется. В основном вам просто нужно написать файл манифеста, определяющий версию 6 общей библиотеки DLL, в качестве требования, а затем вставить его как ресурс или место в 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>
Если вы включите опцию embed, не забудьте включить winuser.h
в файл ресурса. Вы также можете инициализировать общую библиотеку DLL управления в своем WinMain
, в соответствии с это руководство по MinGW:
Я видел этот шаг, пропущенный в некоторых примерах, и он может вызывать некоторые нечетные поведения в определенных версиях операционной системы и определенных условиях, таких как невидимые кнопки или не создаваемые диалоги.
INITCOMMONCONTROLSEX icc;
icc.dwSize = sizeof(icc);
icc.dwICC = ICC_WIN95_CLASSES;
InitCommonControlsEx(&icc);