GDI 雙緩衝實現

2021-09-30 11:45:33 字數 2510 閱讀 6905

gdi+使用雙緩衝繪圖

————————————————————————

我再來詳細解釋一下剛才實現雙緩衝的具體步驟:

1、在記憶體中建立一塊「虛擬畫布」:

bitmap bmp = new bitmap(600, 600);

2、獲取這塊記憶體畫布的graphics引用:

graphics g = graphics.fromimage(bmp);

3、在這塊記憶體畫布上繪圖:

g.fillellipse(brush, i * 10, j * 10, 10, 10);

4、將記憶體畫布畫到視窗中

this.creategraphics().drawimage(bmp, 0, 0);

********************

maybe better

cdc dcmemory;

dcmemory.createcompatibledc(&dc);

cbitmap bmp;

bmp.createcompatiblebitmap(&dc,1024,768);

dcmemory.selectobject(&bmp);

graphics _graphics(dcmemory.m_hdc);

_graphics.drawimage(_pimage,0,0,1024,768);

//這是在gdi+中的寫法。

dc.bitblt(0,0,1024,768,&dcmemory,0,0,srccopy);

_graphics.releasehdc(dcmemory.m_hdc);

dcmemory.deletedc();

bmp.deleteobject();

//注意:

//onerasebkgnd(cdc* pdc)需要返回true。

早前曾為此問題在csdn發帖求助(

gdi+ 如何使用雙緩衝繪製影象),得到了乙個gdi+下較可行的方法,雖然繪製效果比直接繪製要好一些,不過還不能跟gdi的雙緩衝方式比肩。

現在,我終於找到了乙個理想的實現方式,效果與gdi的實現不相上下,**如下:

/*c++ code*/

rect rc;

getclientrect(g_hwnd, &rc);

bitmap bmp(int(rc.right), int(rc.bottom));

graphics bmpgraphics(&bmp);

bmpgraphics.setsmoothingmode(smoothingmodeantialias); \\ 啟動抗鋸齒

/*drawing on bitmap*/

solidbrush bkbrush(color(0, 0, 0));

bmpgraphics.fillrectangle(&bkbrush, 0, 0, rc.right, rc.bottom);

/*drawing on dc*/

graphics graphics(hdc);

/*important! create a cachebitmap object for quick drawing*/

cachedbitmap cachedbmp(&bmp, &graphics);

graphics.drawcachedbitmap(&cachedbmp, 0, 0);

以上的繪製**最區別於網路上其他gdi+實現的一處就是,在最後新增了乙個cachebitmap物件用於快速繪製。

cachebitmap是乙個包含了bmp全部象素,並且針對graphics所關聯的dc做過特別優化的點陣圖物件。這點可以從其構造引數上看到。 

關於雙緩衝的實現還有一點十分關鍵,雖然它不屬於雙緩衝實現的核心。如果繪製需要經常的重繪背景,則需要自己攔截wm_erasebkgnd訊息,並在處理函式中什麼也不做,即此訊息發生時不重畫背景,背景的重畫在wm_paint中全權控制。

如,wm_erasebkgnd訊息處理的實現

void onerasebkgnd(hdc hdc)

附:gdi的雙緩衝實現

rect rc;

getclientrect(hwnd,&rc);

hdc hmemdc = createcompatibledc(hdc);

hbitmap hbmp = createcompatiblebitmap(hdc, rc.right, rc.bottom);

hbitmap holdbmp = (hbitmap)selectobject(hmemdc, hbmp);

//在此使用hmemdc進行 gdi 繪製

bitblt(hdc, 0, 0, rc.right, rc.bottom, hmemdc, 0, 0, srccopy);

selectobject(hmemdc, holdbmp);

deleteobject(hbmp);

deleteobject(hmemdc);

GDI雙緩衝的實現

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

MFC雙緩衝技術(Gdi )

1.建立乙個乙個最簡視窗 見前文 2.在stdafx.h中新增對gdi 的支援 include pragma comment lib,gdiplus.lib using namespace gdiplus ulong ptr m tokengdiplus gdiplus gdiplusstartup...

GDI 中的雙緩衝

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