MFC VC 双缓冲绘图基本原理与实现,详细解释
MFC做了一些時間了,不得不面對 的是在界面上畫圖的。
當然你可以直接搜索到能用的代碼,并且基本能滿足要求。不過這樣總不是學習的態度。本著學習分享的態度,現做一些基本的分析吧。
在MSDN上知道,我們畫圖的對象都是窗口的DC,WINDOWS的繪圖更新時,總是用背景色先填充這個區域,然后才是我們的繪圖代碼,
這就是說,如果我們繪圖的代碼與背景色差別較大,不管我們更新速度多快,總會有種閃爍的感覺。
要想避免,通常的做法都是雙緩沖了,
具體代碼上來了。
void CXX:DrawPic(CDC* pDC/*目標DC指針*/)
{//這里面的CRect rect是你要畫圖的窗口的大小
????? CDC memDC;//
????? memDC.CreateCompatibleDC(pDC);//創建與目標DC相兼容的內存DC,
????? memBitmap.CreateCompatibleBitmap(pDC,rect.Width(), rect.Height());//根據目標DC創建位圖,為什么?看后面
??????memDC.SelectObject(&memBitmap);//把位圖選入內存DC
???? CBrush brush;
?? ? brush.CreateSolidBrush(RGB(255,0,0));//建立個紅色的畫刷給內存DC
? ?? memDC.SelectObject(&brush)///選擇這個刷子
??? ?memDC.Rectangle(0, 0, 100, 100)//一個正方形
?? //將這個DC的全部內容放入pDC,這樣屏幕上才會有圖像
??? pDC->BitBlt(rect.left, rect.top, rect.Width(), rect.Height(),&memDC, 0, 0,SRCCOPY);
???? //結束了 畫圖不要忘記釋放資源,DC是有限的
???? memBitmap.DeleteObject();
?? ? memDC.DeleteDC();
}
?
現在,我來說說:
1.內存DC;MSDN上說,內存DC只存在于內存中,當我們使用memDC.CreateCompatibleDC(pDC)建立它的時候,它只是一個單色的長寬各1像素(one monochrome pixel wide and one monochrome pixel high.)的一個顯示面。
2.上面我建立 了個位圖,為什么?同樣,MS說,一個DC建立后是不能繪圖的,你必須給它選擇一 個與它高寬對應的位圖。于是上面 你可以看到,我用了
memBitmap.CreateCompatibleBitmap(pDC,rect.Width(), rect.Height());//這個位圖是與pDC色彩是一樣的,多色
?memDC.SelectObject(&memBitmap);//把位圖選入內存DC,
做到上上面 的要求。并且還達到另一個目的,就是讓內存DC成為多色的DC,慢慢體會吧
3.為了繪圖,你還要先個畫刷,用來填充繪圖區域,于是我用了
? CBrush brush;
?? ? brush.CreateSolidBrush(RGB(255,0,0));//建立個紅色的畫刷給內存DC
? ?? memDC.SelectObject(&brush)///選擇這個刷子
這3句。然后使用memDC.Rectangle(0, 0, 100, 100)//一個正方形,畫了個紅色的正方形
?
4.使用pDC->BitBlt(rect.left, rect.top, rect.Width(), rect.Height(),&memDC, 0, 0,SRCCOPY);
讓屏幕上有圖像顯示,
5.最后使用:
memBitmap.DeleteObject();
?? ? memDC.DeleteDC();
釋放GDI資源。
這里應該說的是十分清楚的了,如果你沒有成功,請聯系我。如果發現錯誤,也歡迎指正。
另外,也可參照下面的一篇代碼:
| BOOL?CDataStructureView::OnEraseBkgnd(CDC* pDC) { ?????CRect rc; ?????CDC dcMem; ?????GetClientRect(&rc); ?????CBitmap bmp; //內存中承載臨時圖象的位圖 ?????dcMem.CreateCompatibleDC(pDC);//依附窗口DC創建兼容內存DC ?????//創建兼容位圖(必須用pDC創建,否則畫出的圖形變成黑色) ?????bmp.CreateCompatibleBitmap(pDC,rc.Width(),rc.Height()); ?????CBitmap *pOldBit=dcMem.SelectObject(&bmp); ?????//按原來背景填充客戶區,不然會是黑色 ?????dcMen.FillSolidRect(rc,RGB(255,255,255)) ?????//畫圖,添加你要畫圖的代碼,不過用dcMem畫,而不是pDC; ?????...... ?????pDC->BitBlt(0,0,rc.Width(),rc.Height(),&dcMem,0,0,SRCCOPY); ?????//將內存DC上的圖象拷貝到前臺 ?????//繪圖完成后的清理 ?????dcMem.DeleteDC();????//刪除DC ?????bmp.DeleteObject();//刪除位圖 ?????return?true; ?????//這里一定要用return true,如果用自動生成的,會調用基類,把畫出來的覆蓋,就什???? 么結果也沒有了 |
| } |
總結
以上是生活随笔為你收集整理的MFC VC 双缓冲绘图基本原理与实现,详细解释的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 怎么利用ffmpeg和AviSynth给
- 下一篇: 调用C++dll