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

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

This is look I am getting!

Но в Windows 7 кнопки управления выглядят так:

enter image description here

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

Спасибо.

Ответы [ 3 ]

24 голосов
/ 14 апреля 2011

Так выглядели элементы управления в 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 содержит больше информации о визуальных стилях, чем вы когда-либо хотели.


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

Вместо этого вы хотите использовать цвет, используемый для рисования трехмерных элементов управления. Измените элемент hbrBackground вашей структуры WNDCLASS (или WNDCLASSEX), как показано здесь:

wc.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1);

Почему вы должны добавить 1? По причинам обратной совместимости, опять же. Детали скучны. : -)

18 голосов
/ 14 апреля 2011

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

14 голосов
/ 24 июня 2014

Вы, наверное, помните, когда 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>

Если вы выберете опцию встраивания, не забудьте включить winuser.h в ваш файл ресурсов.Вы также можете инициализировать библиотеку общих элементов управления в WinMain в соответствии с этим руководством по MinGW :

В некоторых примерах я пропустил этот шаги это может вызвать некоторые странные поведения в определенных версиях операционной системы и в определенных условиях, например, невидимые кнопки или невозможность создания диалогов.

INITCOMMONCONTROLSEX icc;
icc.dwSize = sizeof(icc);
icc.dwICC = ICC_WIN95_CLASSES;
InitCommonControlsEx(&icc);
...