Программирование в C + win API: как заставить Windows 7 искать элементы управления?
я программирую строго на C и WinAPI, без C++ или c#. Я новичок и только учусь рисовать элементы управления и т. д. Дело в том, что когда я создаю окна или другие элементы управления, такие как командные кнопки, они имеют собственный вид Windows. Взгляните на это:
но в Windows 7, кнопки выглядят так:
теперь, как я могу сделать кнопки в моей программе, чтобы выглядеть. Это вообще возможно? Я после этого урока, для справки:http://zetcode.com/gui/winapi/
спасибо.
3 ответов
вы включаете визуальные стили для своего приложения, предоставляя 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 и классическую тему, и добавил тему метро. Высококонтрастные темы теперь являются частью визуальных стилей и больше не имеют классического внешнего вида.
таким образом, классическое тематическое приложение в 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>
если вы идете для опции embed, не забудьте иметь winuser.h
включено в файл ресурсов. Вы также можете инициализировать общую библиотеку DLL элементов управления в WinMain
, по данным это руководство MinGW:
я видел, что этот шаг пропущен в некоторых примерах, и это может привести к некоторым странным поведениям в определенных версиях операционной системы и определенных условиях, таких как невидимые кнопки или диалоги не удалось создать.
INITCOMMONCONTROLSEX icc;
icc.dwSize = sizeof(icc);
icc.dwICC = ICC_WIN95_CLASSES;
InitCommonControlsEx(&icc);