【问题标题】:Layered windows, UpdateLayeredWindow, alpha blending and mouse events分层窗口、UpdateLayeredWindow、alpha 混合和鼠标事件
【发布时间】:2023-03-17 04:00:01
【问题描述】:

在 Windows 窗体和 C# 中,我使用具有 WS_EX_LAYERED 样式的窗体,并调用 UpdateLayeredWindow 将背景设置为透明/alpha 混合的图像:

NativeMethods.BLENDFUNCTION blend = new NativeMethods.BLENDFUNCTION();
blend.BlendOp = NativeMethods.AC_SRC_OVER;
blend.BlendFlags = 0;
blend.SourceConstantAlpha = 255;
blend.AlphaFormat = NativeMethods.AC_SRC_ALPHA;

NativeMethods.UpdateLayeredWindow(form.Handle, screenDc, ref topPos, ref size, 
    memDc, ref pointSource, 0, ref blend, NativeMethods.ULW_ALPHA);

在图像透明的窗体区域上,窗体不接收鼠标事件。他们转到表单下方的窗口。

是否可以设置窗口样式或选项以使表单能够在其整个表面上接收鼠标事件(鼠标移动、鼠标按下等)?

【问题讨论】:

    标签: c# .net winforms alphablending layered-windows


    【解决方案1】:

    来自Layered Windows

    命中测试

    分层窗口的命中测试基于窗口的形状和透明度。这意味着窗口区域的颜色键或 alpha 值为零将使鼠标消息通过。 如果分层窗口具有 WS_EX_TRANSPARENT 扩展窗口样式,分层窗口的形状将被忽略,鼠标事件将传递给分层窗口下的其他窗口。

    我会尝试修改 WS_EX_TRANSPARENT 样式

    【讨论】:

    • 我一开始没有设置 WS_EX_TRANSPARENT 样式。无论如何,我尝试删除它,但它不起作用。透明区域上的鼠标事件仍然通过。 (为了检查,我也尝试设置它,设置后,所有鼠标事件都会通过,即使在非透明区域也是如此。)
    • @Jamrelian 你可以作弊并将透明区域设置为 alpha 值 1(255)。我想知道这是否基本清楚但不会失败
    • 不幸的是,我没有控制设置为背景的 alpha 混合图像,用户选择它。这意味着我应该以编程方式检查和更改任何加载图像中每个像素的 alpha 值。听起来有很多性能问题...
    • @Jamrelian 为什么窗口首先是分层的,听起来就像你不想要的那样?
    • 它是一种透明的闪屏窗口,这就是为什么它需要分层和alpha混合,但用户可以选择另一个图像。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-01
    • 1970-01-01
    • 2011-02-10
    • 1970-01-01
    • 2011-05-16
    • 1970-01-01
    • 2010-09-16
    相关资源
    最近更新 更多