2008-11-25 12 views
1

我試圖創建一些皮膚的形式(只是邊框和標題)與你通常看到的不同的方法,但我有一些問題與形式閃爍,而我調整窗體的大小。在調整大小的同時,帶有巨大黑色閃爍的皮膚C#表單!

我不知道該怎麼解釋這個問題,所以這裏是我創建的演示問題視頻: http://www.screencast.com/t/AIqK9Szmz

而且,這裏是與重繪表格邊框整個代碼VS2008測試解決方案: http://stuff.nazgulled.net/misc/TestForm.zip

希望有人能幫助我擺脫閃爍...

回答

2

(這是特定於Vista的解決方案;當啓用桌面合成它僅適用)

它看起來像Windows被轉移到新的形式的原始邊界像素複製初始化的調整大小的形式內容區域。在你的情況下,新的區域被初始化爲黑色,可能是因爲該窗體最初在其邊界具有黑色像素。

爲了消除閃爍,只需將表單中最右邊和最底部的像素始終設置爲TransparencyKey - 這將使新區域保持透明,直到您有機會重新繪製它們。也就是說,使得比所需要的更高的1個像素的形狀&,並且使額外的像素透明。

例子:TransparentForm.zip

+0

這對我來說有點困惑,你能幫我提供一個例子嗎?如果您可以使用我提供的測試解決方案並應用您的建議,因爲我不確定要做什麼,那將會很好。 – 2009-03-15 16:55:11

+0

我添加了一個示例(您的測試解決方案不再可用)。 不過,我後來發現,我的解決方案只有在Vista下可與啓用桌面組合。在沒有dwm的XP和Vista下,你仍然會出現黑色閃爍。 – 2009-03-18 13:11:42

3

這就是我在基地窗體的構造函數中使用:

我認爲關鍵是使用「AllPaintingInWmPaint」。

1

如果您想避免醜陋的未初始化的黑色視頻覆蓋閃爍,您將不得不放棄使用Form.TransparencyKey屬性。它在你的示例程序中沒有任何用處。

0

嘗試啓用DoubleBuffering?

3

如果你想讓你的表單具有不規則的形狀,你將不得不轉向區域(如果你可以使用幾何形狀如圓形和矩形來輕鬆定義表單的區域)。創建一個System.Drawing.Graphics.Region對象並向其添加形狀。我認爲表單上的屬性稱爲區域 - 將它分配給您創建的區域。

您的其他選擇是使用分層窗口。有人has done all the work for you。分層窗口不適用於2000以前版本的Windows,但它們具有半透明的附加好處。

您最後的選擇是使用WPF並設置AllowsTransparency =「True」WindowStyle =「None」。這將刪除鉻(谷歌「無鉻窗口WPF」爲百萬例子)。

最後,如果你勇敢耐心,你總是可以捕捉窗口後面的桌面,並在其他任何東西之前將其繪製。如果你的窗戶移動,你將需要訴諸一些奇特的駭客:我不真的推薦這種方法 - 但你需要知道你所有的選擇。

0

哦,順便說一下,除非你把所有的繪製邏輯放在OnPaint()中,否則使用SLIMcode的代碼將不起作用。如果這聽起來不熟悉,則可能不知道可以通過調用窗體上的Invalidate()來強制要求重繪。將代碼重構爲單個Paint方法是一項任務 - 但最終會產生更簡潔的代碼。

+0

這就是說,我不確定是否將OnPaint()中的所有邏輯都修復了閃爍。 – 2008-11-26 13:38:36

0

而調整的雙贏形式,暫停佈局調整大小時要擺脫閃爍。如下所示覆蓋表單resizebegin/resizeend方法。

protected override void OnResizeBegin(EventArgs e) { 
    SuspendLayout(); 
    base.OnResizeBegin(e); 
} 
protected override void OnResizeEnd(EventArgs e) { 
    ResumeLayout(); 
    base.OnResizeEnd(e); 
} 

這將使控制完整的(因爲他們之前調整位置),並強制重繪完成調整操作時。