WinAPI + Cmake + Aero - PullRequest
       33

WinAPI + Cmake + Aero

0 голосов
/ 03 ноября 2019

У меня есть проект 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).

...