0

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

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

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

И вот что я получаю. Итак, вы можете видеть, что происходит смешение. Принимает во внимание альфа-пиксель, но выполняет плохую работу смешивания. Любые идеи, как настроить его? enter image description here

+0

Почему вы используете 200 в своей структуре функций смешивания. Для значений альфа-пикселей вам нужно использовать 255. –

ответ

1

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

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

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

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

Всё.

This answer имеет код, который иллюстрирует технику для немного другой цели.

+0

Спасибо за подсказку. И что, если мне нужны какие-то пиктограммы и значки, нарисованные с некоторыми эффектами прозрачности. (NavigationDiamond, как в редакторе VS) – Antiusninja

+0

Тогда вам нужно исправить растровое изображение. Я не знаю, как вы его создаете, поэтому я не могу много добавить. – arx

+0

Спасибо. На самом деле работает премультипликация. Но я не вижу идеи это премультипликация Итак, если у меня чисто красный цвет, который равен 255 0 0 и 222 alpha , то умножая 255 на 222 (0,87), я получаю ~ 222 0 0 и альфа с 222 , поэтому, когда после этого умножаю его на 1/0.87 Я возвращаю желаемый цвет Но если я не преуспеваю, тогда 255 на 1/.087 выходит из одного байтового диапазона, и происходит неправильное происхождение. Почему бы не взять исходные значения RGB в первую очередь? – Antiusninja

Смежные вопросы