LayeredWindows и переменная прозрачность альфа - с помощью кисти?
У меня есть многоуровневое окно (используя SetLayeredWindowAttributes). Если я установлю альфу для всего окна на 128 и нарисую черные прямоугольники, она будет работать, как и ожидалось (черные прямоугольники, которые просвечивают с непрозрачностью около 50%).
Однако, если я устанавливаю aplha для всего окна (когда я вызываю SetLayeredWindowAttributes на 255), а затем рисую черные прямоугольники с помощью кисти, для которой установлено значение 50%, эти черные прямоугольники являются чисто сплошными, никакой прозрачности вообще.
У меня сложилось впечатление, что, получив таким образом многоуровневое окно, я смогу рисовать в нем с разными уровнями альфа-пикселя на пиксель, так что эти два будут рисовать два уровня непрозрачности:
User32.SetLayeredWindowAttributes(this.Handle, (uint) TransparentColorKey.ToArgb(), 255, User32.LWA_ALPHA | User32.LWA_COLORKEY);
e.Graphics.FillRectangle( new SolidBrush(Color.FromArgb(200, 40, 40, 40)), myRect);
e.Graphics.FillRectangle( new SolidBrush(Color.FromArgb( 25, 40, 40, 40)), myRect);
НО оба этих прямоугольника имеют одинаковый уровень непрозрачности (я ожидаю, что один на 200, один на 25). У меня есть контроль над непрозрачностью ТОЛЬКО для всего окна в целом (255 в SetLayeredWindowAttributes).
Что мне здесь не хватает, чтобы я мог рисовать различные элементы, даже просто прямоугольники, на разных уровнях альфа-прозрачности?
Кстати, я хочу SetLayeredWindowAttributes (а не UpdateLayeredWindow), так как я делаю активное рисование в нем с контекстами устройства. Последний подход требует растрового изображения, составленного и предоставленного за один раз. Спасибо! Дейв
1 ответ
Я не знаю, откуда вы взяли, что SetLayeredWindowAttributes должен позволять вам рисовать альфа-данные прямо в вашем окне. Из документации MSDN только кажется, что разрешено постоянное альфа или цветное написание. Единственный способ получить альфа на пиксель - это UpdateLayeredWindow.