VC 中使用雙緩衝以及出現的問題總結

在使用VC進行UI開發的時候,繪圖是一個比較常見的操作。

網絡上有很多關於“雙緩衝”繪圖的文章。這裏就自己使用時出現的問題做個總結,和大家分享

例如:

在視圖類(View類)的OnDraw(CDC* pDC)函數中

CDC   dcMemeryFirst;    //第一個兼容DC

CDC  dcMemerySecond;     //第二個兼容DC

 

CBitmap        memBmpFirst;      //第一張內存Bitmap

dcMemeryFirst.CreateCompatibleDC(pDC);    //這裏注意,傳入的參數是pDC

 

CRect  rect;
GetClientRect(&rect);    //獲取客戶區的大小,在創建兼容位圖時,指定位圖的大小


memBmpFirst.CreateCompatibleBitmap(pDC, rect.Width(), rect.Height());

 

  CBrush  writeBrush;

  writeBrush.CreateSolidBrush(RGB(255,255,255));

 

  dcMemeryFirst.SelectObject(&membmp);    //兼容位圖選入到兼容dc,這樣就可以在該位圖上繪製

 

  dcMemeryFirst.FillRect(&rect, &writeBrush);  //繪製底色,這裏繪製成白色

 

  dcMemerySecond.CreateCompatibleDC(&dcMemery1);
  
  dcMemerySecond.SelectObject(m_bmtmap);  //加載位圖資源的方式有兩種,這裏使用的是從資源中加載的

 

  memBmpFirst.BitBlt(m_point.x, m_point.y,110,157, &dcMemerySecond,0,0,SRCCOPY); 

 //將第二個兼容DC中的內容繪製到,第一個兼容DC


  pDC->BitBlt(0,0,rect.Width(), rect.Height(),&memBmpFirst,0,0, SRCCOPY);

 //將第一個兼容DC中的內容繪製到,實際DC

 

 memBmpFirst.DeleteObject();

 

 

總結:

1.所謂雙緩衝技術,就是在繪製的時候不是直接繪製到DC表面。而是首先繪製到兼容DC,然後在貼到實際DC。

2.在使用兼容DC的時候一定要將一個位圖對象與之關聯,否則繪製不了。

3.如果缺少上面的dcMemeryFirst.FillRect(&rect, &writeBrush); 那麼你的兼容位圖時黑色的。

 

分析:

1.爲什麼時候雙緩衝技術?

因爲進行大量繪製的時候,下一個繪製狀態最終可能與上一個狀態差別不是很大,但是這個繪製過程中差距比較大,所以我們在內存中將繪製工作完成,最後使用BitBlt將繪製好的圖貼到目標DC中,可以防止閃爍的出現。(例如在一個View中拖動一張圖片的時候)

2。爲什麼使用上述方法,還是出現閃動現象呢?

你可以重載一下OnEraseBkgnd(CDC* pDC)

在該函數中直接 return TRUE;不要總是刷背景,看看是不是OK了?

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章