Win32 LayeredWindow дает плохой визуальный эффект

Я занимаюсь разработкой системы пользовательского интерфейса, в которой есть все эти интеллектуальные функции, такие как отрыв панели, стыковка и т. Д. В настоящее время моя задача состоит в том, чтобы создать наложение на экране, показывающее положение, в котором отсоединенная или закрепляемая панель приземляется. Практически то же самое, что есть в визуальной студии. Для этого я использую пользовательский класс многоуровневых окон, который будет отображаться, когда это необходимо. После этого я начал копать, чтобы добиться необходимого эффекта. Я работал со стандартными функциями GDI раньше, и в основном они в порядке. Но на этот раз я последовал совету по документации, чтобы использовать UpdateLayeredWindow для своих задач и загружать 32-битное изображение из растрового изображения вместо того, чтобы рисовать его с помощью функций GDI. Так что здесь у меня есть 128x128 пикселей в ширину BMP с 222 в альфа-канале и 255 0 0 в RGB

Вот методы, которые я использую для инициализации и рисования.

void Init(HDC in_hdc,HWND in_hwnd)
    {
        bf = { 0, 0, 200, AC_SRC_ALPHA };
        hwnd = in_hwnd;
        hdc_mem = CreateCompatibleDC(in_hdc);
        hBitmap_mem = CreateCompatibleBitmap(in_hdc, canvas_size.cx, canvas_size.cy);
        hBitmap_mem_default = (HBITMAP)SelectObject(hdc_mem, hBitmap_mem);
        hdc_bitmap = CreateCompatibleDC(in_hdc);
    }
    void DrawArea(RECT& in_rect)
    {
        hBitmap_area_default = (HBITMAP)SelectObject(hdc_bitmap, hBitmap_area);
        AlphaBlend(hdc_mem, in_rect.left, in_rect.top, in_rect.right, in_rect.bottom, hdc_bitmap, 0, 0, 2, 2, bf);
        hBitmap_area = (HBITMAP)SelectObject(hdc_bitmap, hBitmap_area_default);
    }
    void Update()
    {
        POINT p = { 0, 0 };
        HDC hdc_screen = GetDC(0);
        UpdateLayeredWindow(hwnd, hdc_screen, &p, &canvas_size, hdc_mem, &p, 0, &bf, ULW_ALPHA);
    }

Этот стиль окна имеет дополнительные функции. WS_EX_LAYERED|WS_EX_TRANSPARENT|WS_EX_TOPMOST

И вот что я получаю. Таким образом, как вы можете видеть, что смешивание имеет место, учитывает альфа на пиксель, но оно плохо работает. Есть идеи как его настроить?

1 ответ

Я подозреваю, что проблема в исходном растровом изображении. Это тот эффект, который вы получаете, когда значения RGB предварительно не умножаются на альфа. Но игнорируйте это, потому что есть намного более простой способ сделать это.

  • Создайте многослойное окно со сплошным цветом фона, установив hbrBackground в WNDCLASSEX состав.

  • Сделайте окно частично прозрачным, вызвав SetLayeredWindowAttributes.

  • Расположите окно там, где вы хотите.

Вот и все.

В этом ответе есть код, который иллюстрирует технику для немного другой цели.

Другие вопросы по тегам