У меня есть проект CMake с исполняемым файлом и статической библиотекой (связана с exe). Библиотека отвечает за реализацию создания окна (с использованием WinAPI для ОС Windows), а исполняемый файл содержит основную точку входа (в данном случае простую int main(...)
функцию).
Я гуглялв течение дня, но не может найти способ создать окно с поддержкой Aero (можно развернуть его, опустив вверх, строка заголовка немного прозрачна и т. д.). Я прочитал статью Включение визуальных стилей MSDN, но я не уверен, как мне справиться с этим с помощью CMake. Особенно из-за того, что реализация окна скрыта для клиента (поскольку она реализована в библиотеке).
Код для управления окнами сейчас действительно прост для простоты. Часть кода будет подвергнута рефакторингу, суть не в этом сейчас. Вот (почти) полный код для создания окна.
bool WindowsWindow::create(const WindowCreateInfo& info)
{
// register custom window class
{
WNDCLASSEX wnd = { 0 };
wnd.cbSize = sizeof(wnd);
wnd.lpszClassName = CLASS_NAME;
wnd.hInstance = GetModuleHandle(nullptr);
wnd.lpfnWndProc = wndProc;
wnd.style = CS_OWNDC;
wnd.hbrBackground = reinterpret_cast<HBRUSH>(COLOR_WINDOW);
wnd.hCursor = LoadCursor(NULL, IDC_ARROW);
if (RegisterClassEx(&wnd) == 0) {
return false;
}
hInstance = wnd.hInstance;
}
HMONITOR monitor = MonitorFromWindow(nullptr, MONITOR_DEFAULTTOPRIMARY);
MONITORINFO monitorInfo;
monitorInfo.cbSize = sizeof(MONITORINFO);
GetMonitorInfo(monitor, &monitorInfo);
LONG style = 0;
LONG exStyle = WS_EX_APPWINDOW;
int x = CW_USEDEFAULT;
int y = CW_USEDEFAULT;
int width = info.width;
int height = info.height;
if (info.isWindowed) {
style = WS_OVERLAPPED | WS_BORDER | WS_CAPTION;
if (info.hasSysMenu) {
style |= WS_SYSMENU;
}
if (info.allowMinimize) {
style |= WS_MINIMIZEBOX;
}
if (info.allowMaximize) {
style |= WS_MAXIMIZEBOX;
}
// ... positioning, adjusting size, etc.
} else {
style = WS_POPUP;
x = monitorInfo.rcMonitor.left;
y = monitorInfo.rcMonitor.top;
width = monitorInfo.rcMonitor.right - x;
height = monitorInfo.rcMonitor.bottom - y;
}
handle = CreateWindowEx(
exStyle,
CLASS_NAME,
info.title,
style,
x,
y,
width,
height,
HWND_DESKTOP,
nullptr,
hInstance,
nullptr
);
if (!handle) {
return false;
}
running = true;
ShowWindow(handle, SW_SHOW);
return true;
}
Цикл - это стандартное Peek-Translate-Dispatch
трио, и WndProc
обрабатывает только сообщение WM_CLOSE
, в противном случае возвращается с DefWindowProc
.
- Как включить поддержку Aero в настройках такого типа?
- Если правильный файл манифеста будет решением, как мне правильно его обработать? Я имею в виду, что клиент (исполняемый файл) не должен заботиться о том, что базовая библиотека использует WinAPI или нет
- Пример CMake был бы действительно полезен
Текущее решение
Мне удалось найти пример (на самом деле из SDK Vulkan), который указал, что мне нужен стиль WS_THICKFRAME
(граница изменения размера), чтобы мое окно стало современным (Aero-like).