Подтвердить что ты не робот

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

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

This is look I am getting!

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

enter image description here

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

Спасибо.

4b9b3361

Ответ 1

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

Ответ 2

То, как элементы управления смотрели еще в 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? По соображениям обратной совместимости снова. Детали скучны.: -)

Ответ 3

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

Classic, Luna, Aero and Metro

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

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

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

enter image description here

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