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

206
03 июля 2022, 01:10

Как правильно создать и использовать 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? Как сделать так чтобы он был прозрачным? Как рисовать на нём?

READ ALSO
Как записать вектор в бинарный файл?

Как записать вектор в бинарный файл?

В чём разница между следующими записями? Как правильно записать вектор в бинарный файл?

298
Я хочу сменить терминал для вывода codeblocks (cmd) на windows Terminal? Как это сделать? Свойство заблокировано(

Я хочу сменить терминал для вывода codeblocks (cmd) на windows Terminal? Как это сделать? Свойство заблокировано(

CodeBlocks по умолчанию все выводит в cmd но я хочу чтобы он выводил сообщения в более удобный для меня терминал - Windows Terminal, но свойство смены терминала...

336
Исправить ошибку (структуры)

Исправить ошибку (структуры)

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

248