У меня есть приложение, использующее эффект стекла Aero, поэтому каждый пиксель имеет альфа-значение в дополнение к значениям красного, зеленого и синего цветов. У меня есть один настраиваемый элемент управления со сплошным белым фоном (альфа = 255). Я хотел бы нарисовать сплошной текст на элементе управления с помощью текстовых функций GDI. Однако эти функции устанавливают для альфа-значения произвольное значение, заставляя текст полупрозрачно отображать любое окно, находящееся под моим приложением.
После вызова рендеринга текста я хотел бы пройтись по всем пикселям в элементе управления и вернуть их альфа-значение на 255. Как лучше всего это сделать?
Мне не повезло с функциями BitBlt
, GetPixel
и SetPixel
. Похоже, они не обращают внимания на значение альфа.
Вот другие решения, которые я рассмотрел и отверг:
- Нарисуйте растровое изображение, затем скопируйте растровое изображение на устройство: при таком подходе визуализация текста не использует характеристики монитора (например, ClearText). Если вы знаете способ заставить GDI отображать текст в растровое изображение точно так, как он будет отображаться на экране, это также решит мою проблему.
- Использовать GDI + для рендеринга текста: это приложение изначально использовало GDI + для рендеринга текста (до того, как я начал работать над поддержкой Aero). Я перешел на GDI из-за трудностей, с которыми я столкнулся при попытке точно измерить строки с помощью GDI +. Я бы предпочел не переключаться обратно.
- Установите область Aero, чтобы избежать рассматриваемого элемента управления: окно моего приложения на самом деле является дочерним окном другого приложения, запущенного в другом процессе. У меня нет прямого контроля над настройками Aero в окне верхнего уровня.
Приложение написано на C # с использованием Windows Forms, хотя я не упоминал выше, как использовать Interop для вызова функций Win32 API.