解決Winform應用程式中窗體背景閃爍的問題

2022-02-24 05:04:56 字數 1648 閱讀 7238

本文**:

我的作業系統是win7,使用的vs版本是vs2012,文中的**都是c#**。

這是乙個winform窗體,裡面放置了乙個panel,dock屬性為fill,backgroundimage使用了《少年電世界》2023年第02期的封面,backgroundimagelayout使用了stretch。

這個介面現在有兩個問題:

1、在窗體第一次被開啟時,背景會出現明顯的閃爍

2、在拉動窗體的邊界以調整窗體大小時,背景非出現明顯的閃爍

為了處理這一問題,我查了一些資料,也都逐個試過了,下面先說下其中的兩個有代表性方法:

方法1:直接使用雙緩衝

setstyle(controlstyles.userpaint, true);

setstyle(controlstyles.allpaintinginwmpaint, true); // 禁止擦除背景.

setstyle(controlstyles.doublebuffer, true); // 雙緩衝

我嘗試著將這段**加到窗體的建構函式中,並不能解決問題,閃爍依然非常明顯

在msdn上還有一篇文章《如何通過對窗體和控制項使用雙緩衝來減少圖形閃爍》

setstyle(controlstyles.optimizeddoublebuffer, true);

這個方法依然不能解決問題

方法2:重寫createparams方法

方法2需要將以下這段**放在form類的**內

protected override createparams createparams

}

這個方法我一開始嘗試的時候一度認為是有效的,但使用了一段時間後還是發現了問題:

1、這個方法可以解決問題1,但不能解決問題2

2、這個方法會影響一些其他控制項、元件的重繪(這點才是致命的)

因此,這個方法也不能解決問題

上面兩個方法都不能解決問題,於是我繼續求助度娘,終於在下面這個頁面找到了解決方法:

方法3:封裝panel類

這個方法,需要新建乙個panelenhanced類繼承panel類,**如下:

//////加強版 panel

///class panelenhanced : panel

//////onpaint 事件

//////protectedoverridevoidonpaint(painteventargs e)

base.onpaint(e);}}

將之前我們建立窗體中的panel容器換為我們新封裝的panelenhanced容器,將程式的背景放到裡面,再執行程式,程式背景閃爍的問題就完美解決了!(自測(非作者)後發現也有問題,就是如果有透明的部分,會被繪成黑色的,也有問題,尷尬。。)

在WinForm應用程式中嵌入WPF控制項

我們知道,在 wpf介面上新增 winform 的控制項需要使用 windowsformhost 類。而在 winform 介面上新增 wpf控制項該如何做呢?有沒有類似的類呢?明顯是有的,elementhost 就是為了在 winform 應用程式中嵌入 wpf元素而定義的。它繼承自system....

在WinForm應用程式中嵌入WPF控制項

我們知道,在 wpf介面上新增 winform 的控制項需要使用 windowsformhost 類。而在 winform 介面上新增 wpf控制項該如何做呢?有沒有類似的類呢?明顯是有的,elementhost 就是為了在 winform 應用程式中嵌入 wpf元素而定義的。它繼承自system....

在WinForm應用程式中嵌入WPF控制項

我們知道,在 wpf介面上新增 winform 的控制項需要使用 windowsformhost 類。而在 winform 介面上新增 wpf控制項該如何做呢?有沒有類似的類呢?明顯是有的,elementhost 就是為了在 winform 應用程式中嵌入 wpf元素而定義的。它繼承自system....