GDI GDI+ 雙緩衝解決閃爍
最近工作遇到繪製控制元件的問題,該控制元件會不斷重新整理,其所在的view可能貼圖,也可能用純色的畫刷刷。這樣就產生了問題了,控制元件狂閃,特別是有背景圖的時候。該控制元件繪製的時候用的是GDI,過程中考慮到圓滑處理等又用到了GDI+。現在用雙緩衝解決閃爍問題。
一 、GDI 雙緩衝這樣做:CDC MemDC; //首先定義一個顯示裝置物件
CBitmap MemBitmap;//定義一個位圖物件
//隨後建立與螢幕顯示相容的記憶體顯示裝置
MemDC.CreateCompatibleDC(NULL); //這時還不能繪圖,因為沒有地方畫
//下面建立一個與螢幕顯示相容的點陣圖,至於點陣圖的大小嘛,可以用視窗的大小
MemBitmap.CreateCompatibleBitmap(pDC,nWidth,nHeight); //將點陣圖選入到記憶體顯示裝置中
//只有選入了點陣圖的記憶體顯示裝置才有地方繪圖,畫到指定的點陣圖上
CBitmap *pOldBit=MemDC.SelectObject(&MemBitmap);
//先用背景色將點陣圖清除乾淨,這裡我用的是白色作為背景,你也可以用自己應該用的顏色
MemDC.FillSolidRect(0,0,nWidth,nHeight,RGB(255,255,255));//繪圖
/***
使用MemDC畫圖
****/
//將記憶體中的圖拷貝到螢幕上進行顯示pDC->BitBlt(0,0,nWidth,nHeight,&MemDC,0,0,SRCCOPY);
//繪圖完成後的清理
MemBitmap.DeleteObject();
MemDC.DeleteDC();
二、使用GDI+繪圖:
//在記憶體中建立一塊“虛擬畫布”:
Bitmap bmp = new Bitmap(600, 600);
//獲取這塊記憶體畫布的Graphics引用:
Graphics g = Graphics.FromImage(bmp);
//在這塊記憶體畫布上繪圖:
g.FillEllipse(brush, i * 10, j * 10, 10, 10);
//將記憶體畫布畫到視窗
Graphics graphics(dc.m_hDC);
graphics.DrawImage(&bmp,rect.left,rect.top,rect.right,rect.bottom);
三、GDI 和GDI+ 混合使用雙緩衝
Graphics *graphics=Graphics::FromHDC(hMemDC); //可以初始化
//這樣GDI和GDI+就畫在一塊記憶體上了
通過以上方法,我的控制元件閃爍問題就解決了,以上這些是我從網上找到的,很感謝大家的分享。在這裡做一下總結,記錄一下。因為水平有限,有些地方可能有錯誤,請各位高手指正。若有更好地辦法,也希望你能告訴我,謝謝。
四、問題
前面說到,我的控制元件放在view中,所以控制元件是有背景的。在利用雙緩衝時,建立一幅圖bmp,再給這幅圖清除,再在上面畫。而我的控制元件是不規則的,在這樣的bmp上畫,相當於這個控制元件的圖形有背景即圖片bmp清除的顏色。而view是有貼圖或刷顏色的,這樣,控制元件就會這樣顯示。舉例:效果如下圖
這樣,橢圓形周圍就有白邊了。這個問題,怎麼解決呢?
五、
後來發現了一個部落格,講述了遊戲中貼圖的方法,試過了,效果是有,但是裁剪的邊界效果不是很好。