双缓冲还闪屏的问题

来源:互联网 发布:python return 编辑:程序博客网 时间:2024/04/30 05:54

原理网上好多,不仔细介绍了:

贴一下用过的代码:

我在对话框中的操作,网上大部分是单文档的,所以,绘图还是要在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/

原创粉丝点击