Использование bitmap для создания прозрачного окна с непрозрачными объектами

Как правильно создать и использовать BITMAP для того чтобы в итоге получить прозрачное окно с непрозрачными объектами? К сожалению пример создания прозрачного окна с поддержкой непрозрачных объектов я найти не смог. Были другие примеры, например создание картинки через BITMAP, но у меня возникает крайне много вопросов "почему тут сделано так, а тут вот так".

Текущий код

#include <windows.h>
#include <gdiplus.h>

LRESULT CALLBACK eventHandler(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch (uMsg)
    {
        case WM_CREATE:
        {
            // CreateWindow(L"button", L"test", WS_CHILD | WS_VISIBLE, 0, 0, 100, 20, hwnd, NULL, (HINSTANCE)GetWindowLongPtr(hwnd, GWLP_HINSTANCE), NULL);
        }

        break;

        case WM_PAINT:
        {
            PAINTSTRUCT ps;
            HDC hdc = BeginPaint(hwnd, &ps);

            EndPaint(hwnd, &ps);
        }

        break;

        case WM_DESTROY:
        {
            PostQuitMessage(0);
        }
    }

    return DefWindowProc(hwnd, uMsg, wParam, lParam);
}

int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE, PWSTR pCmdLine, int nCmdShow)
{
    Gdiplus::GdiplusStartupInput gdiplusStartupInput;
    ULONG_PTR gdiPlusToken;
    Gdiplus::GdiplusStartup(&gdiPlusToken, &gdiplusStartupInput, nullptr);

    WNDCLASS wc = { };

    wc.hbrBackground = CreateSolidBrush(RGB(0x80, 0x0, 0xFF));
    wc.lpfnWndProc = eventHandler;
    wc.hInstance = hInstance;
    wc.lpszClassName = L"test";
    wc.hCursor = LoadCursor(0, IDC_ARROW);

    RegisterClass(&wc);

    int width = 148;
    int height = 140;

    int x = (GetSystemMetrics(SM_CXSCREEN) / 2) - (width / 2);
    int y = (GetSystemMetrics(SM_CYSCREEN) / 2) - (height / 2);

    HWND hwnd = CreateWindowEx(WS_EX_TOPMOST | WS_EX_TOOLWINDOW /*| WS_EX_TRANSPARENT */ | WS_EX_LAYERED, wc.lpszClassName, L"test", WS_POPUP, x, y, width, height, 0, 0, hInstance, 0);

    if (hwnd)
    {
        SetLayeredWindowAttributes(hwnd, 0, 150, LWA_ALPHA);
        ShowWindow(hwnd, nCmdShow);

        MSG msg = { };
        while (GetMessage(&msg, NULL, 0, 0))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }

    Gdiplus::GdiplusShutdown(gdiPlusToken);

    return 0;
}

Пожалуйста, объясните мне как правильно это сделать. Какой функцией лучше создавать BITMAP? Как сделать так чтобы он был прозрачным? Как рисовать на нём?


Ответы (0 шт):