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.
Расположите окно там, где вы хотите.
Вот и все.
В этом ответе есть код, который иллюстрирует технику для немного другой цели.