Интерфейс в Win32 API
Есть окно, созданное на Win32 API в C++, и когда я создаю элементы интерфейса по туториалу из microsoft docs, например кнопку, она имеет отличающийся вид от тех кнопок, которые создаются в .NET Framework (т. е. стандартные кнопки в windows). Вот код кнопки:
HWND hwndButton = CreateWindow(
"BUTTON", // Predefined class; Unicode assumed
"OK", // Button text
WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON, // Styles
0, // x position
0, // y position
60, // Button width
20, // Button height
hwnd, // Parent window
NULL, // No menu.
(HINSTANCE)GetWindowLongPtr(hwnd, GWLP_HINSTANCE),
NULL);
В чем вопрос - как создать кнопку, на Win32, которая будет оформляться под разные видновс по-своему (точно как в .NET Framework)
А вот такие кнопки я хочу создать (как Settings... , View... и тд)

Ответы (1 шт):
тебе надо будет сделать следующие шаги:
добавить подключение заголовка CommCtrl.h в самом начале твоего проекта;
#include <CommCtrl.h>в твоей функции
WinMainв любом месте до создания основного окна приложения написать код инициализации этой библиотеки Common Controls:INITCOMMONCONTROLSEX pInitCommonControlsEx; pInitCommonControlsEx.dwSize = sizeof (INITCOMMONCONTROLSEX); pInitCommonControlsEx.dwICC = ICC_STANDARD_CLASSES; InitCommonControlsEx (&pInitCommonControlsEx);указать линкеру использовать файл comctl32.lib. если пишешь на Visual C++, то это можно сделать одним из двух способов:
непосредственно в коде после подключения хэдеров (
#include...) написать директиву препроцессора для линкера:#pragma comment (lib, "comctl32.lib")изменить настройки проекта:
- в меню «Project» среды разработки выбрать пункт «<имя проекта> Properties...»;
- в появившемся окошке в дереве слева выбрать «Configuration Properties -> Linker -> Input»;
- в списке справа в строке «Additional Dependencies» в список уже указанных библиотек добавить
comctl32.lib(не забывать разделять имена библиотек точкой с запятой;).
указать линкеру использовать именно 6ую версию библиотеки Common Controls. если пишешь на Visual C++, то это можно сделать одним из двух способов:
- непосредственно в коде после подключения заголовков (
#include...) написать директиву препроцессора для линкера:
#pragma comment (linker, "/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")изменить настройки проекта:
- в меню «Project» среды разработки выбрать пункт «<имя проекта> Properties...»;
- в появившемся окошке в дереве слева выбрать «Configuration Properties -> Linker -> Manifest File»;
- в списке справа в строке «Additional Manifest Dependencies» в выпадающем списке выбрать пункт «<Edit...>»;
- в ещё одном появившемся окошке в самом верхнем текстовом поле написать:
type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'- нажать на кнопку «ОК»;
- непосредственно в коде после подключения заголовков (
возможно, а точнее скорее всего, шрифт надписи на кнопке будет по умолчанию использован не тот, что у тебя на скриншоте, на котором ты показал желаемые тобой кнопки. если так, то тебе надо будет указать кнопке использовать системный шрифт, для этого тебе снова придЁтся написать немного кода:
объявить глобальную переменную для хэндла шрифта:
HFONT hFontButton;в оконной процедуре обработки сообщений основного окна для сообщения
WM_CREATE, где по идее должна создаваться кнопка, написать код, который получает параметры системного шрифта, затем создаЁт шрифт по этим параметрам и потом его (шрифт) передаЁт кнопке:// объявление структуры для получения системных параметров NONCLIENTMETRICS pNonClientMetrics; pNonClientMetrics.cbSize = sizeof (NONCLIENTMETRICS); // получение некоторых системных данных, где указаны параметры системного шрифта SystemParametersInfo (SPI_GETNONCLIENTMETRICS, sizeof (NONCLIENTMETRICS), &pNonClientMetrics, 0); // создание шрифта hFontButton = CreateFontIndirect (&pNonClientMetrics.lfMenuFont); // создание кнопки hWndButton = CreateWindowEx (0, "BUTTON", "Process", WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN, 5, 5, 100, 24, hWnd, (HMENU) 101, NULL, NULL); // передача шрифта кнопке SendMessage (hWndButton, WM_SETFONT, (WPARAM) hFontButton, TRUE);в оконной процедуре обработки сообщений основного окна для сообщения
WM_DESTROYнеобходимо уничтожить шрифт, который ранее был создан для кнопки.ВАЖНО: код уничтожения шрифта должен быть написан до кода передачи сообщения о завершении работы приложения:
// уничтожение шрифта DeleteObject (hFontButton); // поместить в очередь сообщений сообщение о выходе из приложения с кодом ошибки 0 (нет ошибки) PostQuitMessage (0);