c#如何?防表單閃爍的功能。大家都會想到運用雙緩衝技術,那麼在c#中是如何做的?
1、 利用預設雙緩衝
(1)在應用程式中使用雙緩衝的最簡便的方法是使用 .NET Framework 為表單和控制項提供的預設雙緩衝。通過將 DoubleBuffered 屬性設定為 true。
this.DoubleBuffered=true;
(2)使用 SetStyle 方法可以為 Windows 表單和所創作的 Windows 控制項啟用預設雙緩衝。
SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
2、 手工設定雙緩衝
.netframework提供了一個類BufferedGraphicsContext負責單獨分配和管理圖形緩衝區。每個應用程式定義域都有自己的預設 BufferedGraphicsContext 執行個體來管理此應用程式的所有預設雙緩衝。大多數情況下,每個應用程式只有一個應用程式定義域,所以每個應用程式通常只有一個預設 BufferedGraphicsContext。預設 BufferedGraphicsContext 執行個體由 BufferedGraphicsManager 類管理。通過管理BufferedGraphicsContext實現雙緩衝的步驟如下:
(1)獲得對 BufferedGraphicsContext 類的執行個體的引用。
(2)通過調用 BufferedGraphicsContext.Allocate 方法建立 BufferedGraphics 類的執行個體。
(3)通過設定 BufferedGraphics.Graphics 屬性將圖形繪製到圖形緩衝區。
(4)當完成所有圖形緩衝區中的繪製操作時,可調用 BufferedGraphics.Render 方法將緩衝區的內容呈現到與該緩衝區關聯的繪圖圖面或者指定的繪圖圖面。
(5)完成呈現圖形之後,對 BufferedGraphics 執行個體調用釋放系統資源的 Dispose 方法。
完整的例子,在一個400*400的矩形框內繪製10000個隨機產生的小圓。
BufferedGraphicsContext current = BufferedGraphicsManager.Current; //(1)</p><p> BufferedGraphics bg;</p><p> bg = current.Allocate(this.CreateGraphics(),this.DisplayRectangle); //(2)</p><p> Graphics g = bg.Graphics;//(3)</p><p> //隨機 寬400 高400</p><p> System.Random rnd = new Random();</p><p> int x,y,w,h,r,i;</p><p> for (i = 0; i < 10000; i++)</p><p> {</p><p> x = rnd.Next(400);</p><p> y = rnd.Next(400);</p><p> r = rnd.Next(20);</p><p> w = rnd.Next(10);</p><p> h = rnd.Next(10);</p><p> g.DrawEllipse(Pens.Blue, x, y, w, h);</p><p> }</p><p> bg.Render();//(4)</p><p> //bg.Render(this.CreateGraphics());</p><p> bg.Dispose();//(5)<br />
3、 自己開闢一個緩衝區(如一個不顯示的Bitmap對象),在其中繪製完成後,再一次性顯示。
完整代碼如下:
Bitmap bt = new Bitmap(400, 400);</p><p> Graphics bg = Graphics.FromImage(bt);</p><p> System.Random rnd = new Random();</p><p> int x, y, w, h, r, i;</p><p> for (i = 0; i < 10000; i++)</p><p> {</p><p> x = rnd.Next(400);</p><p> y = rnd.Next(400);</p><p> r = rnd.Next(20);</p><p> w = rnd.Next(10);</p><p> h = rnd.Next(10);</p><p> bg.DrawEllipse(Pens.Blue, x, y, w, h);</p><p> }</p><p> this.CreateGraphics().DrawImage(bt, new Point(0, 0));<br />