2012-12-14 196 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