MFC基于对话框的程序,如何实现移动位图时不闪屏?
我建了一个基于对话框的工程,在窗口的鼠标移动事件中写了一些响应事件,但是图片移动时有痕迹,添加InvalidateRect()函数后又出现闪屏,在网上查了许多资料都说用双...
我建了一个基于对话框的工程,在窗口的鼠标移动事件中写了一些响应事件,但是图片移动时有痕迹,添加InvalidateRect()函数后又出现闪屏,在网上查了许多资料都说用双缓存来做,我按照说的方法来还是没有效果,不知道是不是我用的不是双缓存,或者说有其余的解决方法,或者这么写是不对的。求帮助:
我的代码如下:
(不加InvalidateRect函数,移动不会闪屏,但有移动痕迹,加了就会闪屏,但是没有移动痕迹,我现在希望没有移动痕迹且不闪屏的效果)
void CTestMFCImageDlg::OnMouseMove(UINT nFlags, CPoint point)
{
CBitmap cbmp; //内存中承载临时图象的位图
cbmp.LoadBitmap(IDB_BITMAP2);
CDC* pDC =GetDC();
CPoint ptCenter;
CRect rect;
GetClientRect(&rect);
CDC dcMem; //用于缓冲作图的内存DC
dcMem.CreateCompatibleDC(pDC); //依附窗口DC 创建兼容内存DC
dcMem.FillSolidRect(rect,pDC->GetBkColor());//按原来背景填充客户区,不然会是黑色
dcMem.SelectObject(&cbmp); //将位图选择进内存DC
//将内存DC 上的图象拷贝到前台
pDC->BitBlt(point.x,point.y,rect.Width(),rect.Height(),&dcMem,0,0,SRCCOPY);
cbmp.DeleteObject(); //删除位图
dcMem.DeleteDC(); //删除DC
CDialog::OnMouseMove(nFlags, point);
}
有人说这是移动事件响应太频繁了,用鼠标移动消息不合适,不知道到底是不是这样,如果是的话,有什么思路,如何不是的话,又如何修改? 展开
我的代码如下:
(不加InvalidateRect函数,移动不会闪屏,但有移动痕迹,加了就会闪屏,但是没有移动痕迹,我现在希望没有移动痕迹且不闪屏的效果)
void CTestMFCImageDlg::OnMouseMove(UINT nFlags, CPoint point)
{
CBitmap cbmp; //内存中承载临时图象的位图
cbmp.LoadBitmap(IDB_BITMAP2);
CDC* pDC =GetDC();
CPoint ptCenter;
CRect rect;
GetClientRect(&rect);
CDC dcMem; //用于缓冲作图的内存DC
dcMem.CreateCompatibleDC(pDC); //依附窗口DC 创建兼容内存DC
dcMem.FillSolidRect(rect,pDC->GetBkColor());//按原来背景填充客户区,不然会是黑色
dcMem.SelectObject(&cbmp); //将位图选择进内存DC
//将内存DC 上的图象拷贝到前台
pDC->BitBlt(point.x,point.y,rect.Width(),rect.Height(),&dcMem,0,0,SRCCOPY);
cbmp.DeleteObject(); //删除位图
dcMem.DeleteDC(); //删除DC
CDialog::OnMouseMove(nFlags, point);
}
有人说这是移动事件响应太频繁了,用鼠标移动消息不合适,不知道到底是不是这样,如果是的话,有什么思路,如何不是的话,又如何修改? 展开
4个回答
展开全部
InvalidateRect函数的最后一个参数bErase你是传入FALSE了么?每次刷新背景容易闪烁。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
使用双缓冲,网上很多例子,收双缓冲就大把
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你可以把cbitmap和MEDC设为全局的试一下
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询