2012-12-14 188 views
1

在Windows窗体和C#中,我使用WS_EX_LAYERED样式的表单,并调用UpdateLayeredWindow将背景设置为透明/ alpha混合的图像:分层窗口,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); 

在图像透明的窗体区域,窗体不会收到鼠标事件。他们去窗体下的窗口。

是否有窗口样式或选项可以设置为使窗体在其整个表面上接收鼠标事件(鼠标移动,鼠标向下等)?

回答

0

Layered Windows

命中测试

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

我会尝试rmeoving是WS_EX_TRANSPARENT风格

+0

我没有设置WS_EX_TRANSPARENT风格摆在首位。无论如何,我试图删除它,但它不起作用。透明区域上的鼠标事件仍然通过。 (要检查,我也尝试设置它,设置时,所有鼠标事件都会通过,即使在非透明区域也是如此。) – Jamrelian

+0

@Jamrelian你可以欺骗并设置透明区域为alpha值1(255)。我想知道这是否基本上是明确的,但不会下降 – Alan

+0

不幸的是,我不控制图像与设置为背景的alpha混合,用户选择它。这意味着我应该以编程方式检查并更改任何加载图像中每个像素的Alpha值。听起来像很多性能问题... – Jamrelian