LayeredWindow提供兩種模式:
1.使用SetLayeredWindowAttributes去設置透明度, 完成窗口的統一透明,此時窗口仍然收到PAINT消息, 其他應用跟普通窗口一樣.
2.使用UpdateLayeredWindow方法, 向系統提交包含bitmap的DC, 交由系統統一管理,此時再也收不到paint消息, 任何對窗口的改變,只能通過UpdateLayeredWindow來修改.
如果你不需要針對像素級別的不同透明,只需要使用SetLayeredWindowAttributes模式即可,用法與普通窗口用法一樣,有一點不同,系統會緩存窗口的bitmap,所以當窗口上面的其他窗口被移開時,這是系統會去自己繪制,不會發送paint消息。使用這種模式的好處時,你基本不用改變你使用窗口的方法,你收到paint消息后,繪制的圖像會被系統重定向到另一個函數里面,進行組合,從而得出透明效果。
如果你需要達到針對像素級別的不同透明,或者你想更加直接的去控制窗口的繪制,就必須使用UpdateLayeredWindow方法了,這個方法不重定向你的繪制結果,也不緩存窗口的bitmap,而是完全由你自己來繪制,這樣在內存上來說,是更高效的。
1.一旦你調用了SetLayeredWindowAttributes,UpdateLayeredWindow的調用就會失敗,你需要重新設置WS_EX_LAYERED,這是兩種模式切換的關鍵。 2.WS_EX_LAYERED屬性是不可以設置給子窗口 3.在完全透明的地方,鼠標的點擊將會被穿過,另如果對窗口設置了WS_EX_TRANSPARENT屬性,鼠標消息也會穿過
DM使用了以下方式來實現UpdateLayeredWindow窗口接收PAINT消息: