GDI 中的雙緩衝

2021-08-25 17:53:59 字數 1580 閱讀 2759

1、使用.net框架的預設雙緩衝

(1)在應用程式中使用雙緩衝的最簡便的方法是使用 .net framework 為窗體和控制項提供的預設雙緩衝。通過將 doublebuffered 屬性設定為 true。

this.doublebuffered=true;

(2)使用 setstyle 方法可以為 windows 窗體和所創作的 windows 控制項啟用預設雙緩衝。

setstyle(controlstyles.optimizeddoublebuffer, true);

這種方法只是設定了底層繪製時的雙緩衝,但是在onpaint方法裡自定義的繪製還是沒有雙緩衝實現的,所以,在重寫onpaint時候需要手工自定義的實現雙緩衝。方法看下節。

.net framework提供了乙個類 - bufferedgraphicscontext,負責單獨分配和管理圖形緩衝區。每個應用程式域都有自己的預設 bufferedgraphicscontext 例項來管理此應用程式的所有預設雙緩衝。大多數情況下,每個應用程式只有乙個應用程式域,所以每個應用程式通常只有乙個預設 bufferedgraphicscontext。預設 bufferedgraphicscontext 例項由 bufferedgraphicsmanager 類管理。通過管理bufferedgraphicscontext實現雙緩衝的步驟如下:

(1)獲得對 bufferedgraphicscontext 類的例項的引用。

(2)通過呼叫 bufferedgraphicscontext.allocate 方法建立 bufferedgraphics 類的例項。

(3)通過設定 bufferedgraphics.graphics 屬性將圖形繪製到圖形緩衝區。

(4)當完成所有圖形緩衝區中的繪製操作時,可呼叫 bufferedgraphics.render 方法將緩衝區的內容呈現到與該緩衝區關聯的繪圖圖面或者指定的繪圖圖面。

(5)完成呈現圖形之後,對 bufferedgraphics 例項呼叫釋放系統資源的 dispose 方法。

例如:bufferedgraphicscontext context = bufferedgraphicsmanager.current; bufferedgraphics bg = context.allocate(graphics, rectangle); bg.graphics.clear(color.white); foreach (shapeline line in this.linecollection) bg.graphics.drawline(systempens.controltext, startpoint, endpoint); bg.render(); bg = null;

3、自己開闢乙個緩衝區

如乙個不顯示的bitmap物件,在其中繪製完成後,再一次性顯示。

例如:bitmap bmp = new bitmap(600,600);//虛擬畫布 graphics g = graphics.fromimage(bmp);//獲取記憶體畫布的graphics引用 ....... //用g在bmp上畫圖 ....... this.creategraphics().drawimage(bmp, 0, 0);//將記憶體畫布畫到視窗中

GDI 雙緩衝實現

gdi 使用雙緩衝繪圖 我再來詳細解釋一下剛才實現雙緩衝的具體步驟 1 在記憶體中建立一塊 虛擬畫布 bitmap bmp new bitmap 600,600 2 獲取這塊記憶體畫布的graphics引用 graphics g graphics.fromimage bmp 3 在這塊記憶體畫布上繪...

GDI雙緩衝的實現

gdi雙緩衝其實就是將我們所需要畫在視窗dc上的物件預先畫在記憶體dc上,再將記憶體dc畫到視窗dc上,這樣就可以減少過多對視窗dc操作而產生閃爍現象。簡單的實現 如下 hdc hdc getdc hwnd hwnd為視窗控制代碼 int nwidth rc.right rc.left rc為視窗的...

GDI 中雙緩衝的基本寫法

在vc中經常需要對介面進行重繪,其中為了保持介面不閃爍,就需要用到雙緩衝處理方法。詳細的過程如下所示 cdcdcmemory dcmemory createcompatibledc dc cbitmap bmp bmp.createcompatiblebitmap dc 1024,768 dcmem...