【问题标题】:LayeredWindows and variable alpha translucency - using a Brush?LayeredWindows 和可变 alpha 半透明 - 使用画笔?
【发布时间】:2013-01-10 10:00:49
【问题描述】:

我有一个分层窗口(使用 SetLayeredWindowAttributes)。如果我将整个窗口的 alpha 设置为 128 并在其上绘制黑色矩形,它会按预期工作(黑色矩形以大约 50% 的不透明度显示)。

但是,如果我在整个窗口上设置 aplha(当我调用 SetLayeredWindowAttributes 为 255 时),然后用设置为 50% 的画笔绘制黑色矩形,它们黑色矩形是纯实心的,没有任何半透明。

我的印象是,一旦我以这种方式创建了一个分层窗口,我就可以在其中绘制不同级别的每像素 Alpha,这样这两个窗口就会绘制两个级别的不透明度:

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)。我只能控制整个窗口的不透明度(SetLayeredWindowAttributes 中的 255)。

我在这里遗漏了什么,以便我可以绘制不同的元素,甚至只是矩形,具有不同的 Alpha 半透明度?

顺便说一句,我想要 SetLayeredWindowAttributes(而不是 UpdateLayeredWindow),因为我正在使用设备上下文进行主动绘图。后一种方法需要一次性绘制并提供位图。 谢谢! 戴夫

【问题讨论】:

    标签: winapi gdi+ alphablending layered-windows


    【解决方案1】:

    我不知道您从哪里得到 SetLayeredWindowAttributes 应该允许您将 alpha 数据直接绘制到您的窗口的想法。从 MSDN 文档看来,它似乎只允许恒定的 alpha 或颜色键控。获得每像素 alpha 的唯一方法是使用 UpdateLayeredWindow。

    【讨论】:

    • 这几乎也是我得到的结果,所以切换到 UpdateLayeredWindow,它可以工作。不幸的是。
    猜你喜欢
    • 2021-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-24
    • 1970-01-01
    • 1970-01-01
    • 2013-04-05
    相关资源
    最近更新 更多