1. 程式人生 > >GDI GDI+ 雙緩衝解決閃爍

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是有貼圖或刷顏色的,這樣,控制元件就會這樣顯示。舉例:效果如下圖


這樣,橢圓形周圍就有白邊了。這個問題,怎麼解決呢?

五、

後來發現了一個部落格,講述了遊戲中貼圖的方法,試過了,效果是有,但是裁剪的邊界效果不是很好。