原理网上好多,不仔细介绍了:
贴一下用过的代码:
我在对话框中的操作,网上大部分是单文档的,所以,绘图还是要在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/