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...