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

2022-03-11 13:13:02 字數 1629 閱讀 7329

本文**:

我的作業系統是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 事件

///

///

protected override void onpaint(painteventargs e)

base.onpaint(e);}}

將之前我們建立窗體中的panel容器換為我們新封裝的panelenhanced容器,將程式的背景放到裡面,再執行程式,程式背景閃爍的問題就完美解決了!

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

本文 我的作業系統是win7,使用的vs版本是vs2012,文中的 都是c 這是乙個winform窗體,裡面放置了乙個panel,dock屬性為fill,backgroundimage使用了 少年電世界 2003年第02期的封面,backgroundimagelayout使用了stretch。這個介...

WinForm 應用程式窗體的啟動和關閉過程

以下是網路上可搜尋到的次序 當 windows form 應用程式啟動時,會以下列順序引發主要表單的啟動事件 system.windows.forms.control.handlecreated system.windows.forms.control.bindingcontextchanged s...

C 窗體應用程式

看了一段時間的c 了,於是就想實戰一下,看了網上的一些教程,用vs寫乙個窗體程式,拉起乙個視窗,本人想著從初級的入門開始,到以後可以根據自己的需求,寫出一些上位機軟體和一些工具方便自己除錯微控制器 用。1 include 2 include 3 include 4 define win32 lean...