日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > C# >内容正文

C#

如何使用C#自带的GDI+双缓冲类BufferedGraphics实现双缓冲功能

發(fā)布時間:2023/12/18 C# 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 如何使用C#自带的GDI+双缓冲类BufferedGraphics实现双缓冲功能 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

小白摸索著編寫一個上位機(jī)界面,將遇到的問題及解決方法記錄下,以供后來的小白使用哈。這篇文章解決的問題是在繪圖時候的閃爍問題。其中網(wǎng)上有些介紹的設(shè)置控制方式controlstyle的方法,這個方法我的理解是比較適合于在一個完整的窗口當(dāng)中繪圖。如果要在一個窗口當(dāng)中的內(nèi)部容器或者控件內(nèi)畫圖的話就不太適合,通常按照前述的方法設(shè)置后沒有任何效果。對于在窗口內(nèi)部的繪圖的來說,比較有效的方法是在內(nèi)存當(dāng)中開辟一塊區(qū)域,先在內(nèi)存中繪制好圖后再在窗體中顯示出來。這個方法可以有效的消除或者減輕繪圖閃爍的問題。在C#中,提供了BufferedGraphics類來實現(xiàn)此功能。這篇文章就介紹如何用C#自帶的類來實現(xiàn)雙緩沖繪圖。

直接貼出完整的代碼

[csharp]?view plaincopy
  • ?private?void?Form1_Paint(object?sender,?PaintEventArgs?e)??
  • ????????{??????
  • ????????????//創(chuàng)建一個緩沖圖像背景類?MyBufferedGraphics????????????
  • ????????????BufferedGraphics?MyBuffer?=?MyBufferedGraphics.Allocate(panel1.CreateGraphics(),?panel1.ClientRectangle);//創(chuàng)建一個緩沖圖像MyBuffer??
  • ????????????MyBufferedGraphics.MaximumBuffer?=?new?Size(panel1.ClientRectangle.Width,?panel1.ClientRectangle.Height);//指定緩沖圖像背景類的大小???????????????????????MyBuffer.Graphics.FillRectangle(Brushes.WhiteSmoke,panel1.CreateGraphics().ClipBounds);//指定圖像背景色??
  • ????????????MyBuffer.Graphics.DrawEllipse(new?Pen(Color.Red),0,0,100,100);?//畫一個紅色的圓作為測試????????????
  • ????????????MyBuffer.Render(/*panel1.CreateGraphics()*/);//將畫好的圓顯示到窗口當(dāng)中??
  • ????????????MyBuffer.Dispose();//釋放資源??
  • ????????}??
  • ? ? ? ? ? ? ?

    注意,這個項目窗體中只含有一個panel1的控件。

    代碼介紹,

    1、實例化一個BufferedGraphicsContext類,相當(dāng)于在內(nèi)存當(dāng)中開辟了一片區(qū)域來準(zhǔn)備畫圖,

    2、BufferedGraphics類不能直接使用new關(guān)鍵字實例化,需要使用BufferedGraphicsContext類的Allocate()方法指定,指定的方式可以參考MSDN。在上面的例子當(dāng)中,就把圖形緩沖區(qū)和窗口的panel控件聯(lián)系了起來。

    3、指定背景圖顏色語句也是需要的,不然不加此句的話,畫出來控件panel1的背景默認(rèn)為黑色,我們可以根據(jù)需要來選擇顏色。其中若選中了白色,實際為透明的,選為WhiteSmoke的話則為白底。

    4、BufferedGraphics,Render()將在緩沖區(qū)畫好的圖畫到窗體中,實現(xiàn)了雙緩沖功能,顯示完畢后要釋放所占系統(tǒng)資源。

    5、在比較復(fù)雜的程序中,還要注意線程的安全問題。BufferedGraphics 類不是線程安全的。從單獨的線程中訪問圖形緩沖區(qū)時,一定要使用一個線程訪問控制機(jī)制
    以避免發(fā)生沖突。


    總結(jié)

    以上是生活随笔為你收集整理的如何使用C#自带的GDI+双缓冲类BufferedGraphics实现双缓冲功能的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。