原理網上好多,不仔細介紹了:
貼一下用過的代碼:
我在對話方塊中的操作,網上大部分是單文檔的,所以,繪圖還是要在OnPaint()中操作的,調用TryDraw():
void CSHANPingDlg::TryDraw()
{
CPaintDC dc(this);
CDC dcMem;
CBitmap bm;
CRect rc;
GetClientRect(&rc);
// Step 1:為螢幕DC建立相容的記憶體DC :CreateCompatibleDC()
dcMem.CreateCompatibleDC(&dc);
// Step 2:建立位元影像:CreateCompatibleBitmap()
bm.CreateCompatibleBitmap(&dc,rc.Width(),rc.Height());
// Step 3:把位元影像選入裝置環境:SelectObject(),可以理解為選擇畫布
dcMem.SelectObject(&bm);
// dcMem.FillSolidRect(0,0,rc.Width(),rc.Height(),RGB(255,255,255));
dcMem.FillSolidRect(rc,dc.GetBkColor());
// dcMem.SetBkMode(TRANSPARENT);//設定透明背景色
// dcMem.Ellipse(100,100,50+i*5,50+i*5);// 畫橢圓
dcMem.MoveTo(50,point1.y);
dcMem.LineTo(point1.x,point1.y);
dcMem.MoveTo(point1.x,50);
dcMem.LineTo(point1.x,point1.y);
// 畫其它圖形
// Step 4:把繪製好的圖形“拷貝”到螢幕上:BitBlt()
dc.BitBlt(0,0,rc.Width(),rc.Height(),&dcMem,0,0,SRCCOPY);
dcMem.DeleteDC();
bm.DeleteObject();
}
以上是雙緩衝的繪圖過程,但是還是不夠的,要阻止背景的不斷重新整理:
BOOL CSHANPingDlg::OnEraseBkgnd(CDC* pDC)
{
// TODO: Add your message handler code here and/or call default
return true;//
// return CDialog::OnEraseBkgnd(pDC);
}
要添加這個訊息響應函數,同時修改代碼return true即可。
me: 的確, 加了這個return true; 就不閃了(我是在對話方塊的OnPaint中繪圖的);
http://licaiyuren.blog.163.com/blog/static/69654830201010152439345/