2009-02-06 105 views
2

環境是C/C++下的普通win32,沒有任何花哨的MFC或類似的巨無霸。我有一個窗戶,裏面有幾個孩子和孫子。有些孩子是怪異的圖標,我需要他們有透明的背景(奇怪形狀的圖標)。考慮這種僞結構:如何強制父窗口繪製「under」子窗口?

  • Parent1
    • Child1(正常)
    • CHILD2(奇怪形狀的圖標)
    • Child3(正常)/ Parent2
      • Grandchild1(正常)
      • 孫子2(怪形圖標)

以上,CHILD2和Grandchild2應該有透明的背景(WM_ERASEBKGND什麼也不做,或(WNDCLASS) - >看一看hbrBackground = NULL)。現在這些圖標的背景是透明的,但透明到極端 - 我看到Parent1下的東西 - 桌面等。

這一切都發生在Windows Mobile下。

是否有任何額外的標誌,我必須爲Parent1和Parent2設置?你可能會提供什麼好的技巧?

如果沒有人有類似的問題,我會感到驚訝,因爲許多應用程序現在必須顯示圖標,所有形狀和大小。

編輯:形狀奇怪的窗口是透明膠片的圖標。如果父窗口不會爲這些特定的窗口執行剪切,而是在每次父開始繪製時都使其無效,那將會很好。 CS_PARENTDC看起來非常有前途,但沒有足夠的前景。有任何想法嗎?

回答

0

GWES不會繪製包含父窗口內容的任何子窗口的矩形。永遠。期。這是設計。

您可以在子矩形中繪製父代中的WM_CTL...響應,也可以子類化子代並完全覆蓋子代的WM_PAINT。對於某些窗口來說,這將非常困難,比如編輯控件,但它通常是可行的。

1

在形狀奇怪的窗口中,你是如何處理WM_PAINT的?你在擦除背景嗎?也許更好的解決方案是使用非矩形剪輯區域?

編輯 SetWindowRgn is documented here - 我說錯了「裁剪區域」,我真的在想這個方法。你設置了一個不規則的區域,它是你的圖標的形狀,然後繪製。我認爲這可能是繪製奇怪形狀窗口的常用技術。

+0

是的,WM_PAINT正在調用DrawIcon。我如何設置非矩形剪輯區域? – 2009-02-06 08:40:09

0

如果您嘗試使用SetBkColor()不能在窗口中指定WM_PAIN處理中的顏色,那麼它的大小是否不規則無關緊要。我的問題正確嗎?

+0

背景(父窗口)不一定是純色。它可能是漸變的,或者更糟糕的是,一個位圖! – 2009-02-06 09:52:53

0

我偶然發現這個條目,同時尋找方法來強制Windows CE從更新區域中刪除子窗口的剪輯。這似乎根本不可能。 正如Johann Gerell所提到的,GWES會一直剪輯孩子。這當然使得永遠不可能有透明的靜態字段! 我已經盡力了。在WM_ERASEBKGND期間設置一個自定義的未剪切的矩形區域,但GWES會保留其舊剪裁區域。 我有一堆放置在位圖上的靜態控件(在WM_ERASEBKGND期間繪製)。 這甚至可以在Windows CE上?