2009-02-16 368 views
3

我想用透明度創建頂層窗口(即非WS_CHILD)。然而,我不希望它是一個簡單的面具,其中一個給定的像素是完全透明或完全不透明的。而且我不希望整個窗口對它有一些alpha級別。相反,我希望這個窗口基本上是完全透明的,用一個alpha通道繪製一個位圖,這樣位圖就可以和它後面的任何窗口混合在一起。圖片,比如說,一個陽光照射,圖像自己的alpha從不透明到從中心向外完全透明的混合。透明頂層窗口

我發現兩種方法,都得到接近我想要做的,但並不完全。使用區域,我可以剪出一個完全透明的部分。使用分層窗口,我也可以做類似的事情(甚至可以使整個窗口稍微透明,但這不是我想要的)。我研究過其他樣式,例如WS_EX_TRANSPARENT和WS_EX_COMPOSITE,但無濟於事。

我能得到這樣的效果上下工夫子窗口就好了,因爲它們與他們的父母的區域內其父窗口交融。讓頂級窗口以類似的方式工作仍然無法實現。

我知道這是可以做到,因爲人們都向我保證,他們已經看到了它在其他程序中。我覺得我只是沒有完全理解關於繪畫窗口的一些簡單的東西。

回答

2

Layered windowsWS_EX_LAYERED)應該做的工作,記住,你必須使用UpdateLayeredWindow()和不同尋常的位圖格式(32位,預乘阿爾法)來指定每個像素的阿爾法值(SetLayeredWindowAttributes()只會讓你爲整個窗口或顏色鍵指定單個Alpha值)。

你說你已經試過這個 - 你遇到過什麼問題?

+0

我的問題是我不理解如何正確使用UpdateLayeredWindow,所以沒想到我需要它。關鍵是設置混合函數併爲位圖提供正確的直流。所以,得到它的工作,謝謝! – 2009-02-17 17:10:52

1

我知道拿到窗口上每個像素的α的唯一方法是UpdateLayeredWindow()。
看看這個MSDN鏈接:http://msdn.microsoft.com/en-us/library/ms997507.aspx

注意,使用UpdateLayeredWindow應用程序時不需要回應WM_PAINT或其他繪畫的消息,因爲它已經提供的視覺表現爲窗口,系統將照顧存儲該圖像,編寫它,並將其呈現在屏幕上。 UpdateLayeredWindow功能非常強大,但它通常需要修改現有Win32應用程序繪製的方式

我敢打賭,這些都是你遇到的問題。

+0

出於某種原因,我一直忽略UpdateLayeredWindow(),但更多地看它,我得到了它的工作。幸運的是,我實際上甚至不必更改我的應用程序如何繪製過於劇烈,因爲它只適用於某些特定的窗口。 – 2009-02-17 17:16:15