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

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

This is look I am getting!

но в Windows 7, кнопки выглядят так:

enter image description here

теперь, как я могу сделать кнопки в моей программе, чтобы выглядеть. Это вообще возможно? Я после этого урока, для справки: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 лучшую поддержку тематизации.

Classic, Luna, Aero and Metro

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

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

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

enter image description here

в любом случае эта статья 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);