使用InvalidateRect(rect) 防止图片移动时发生闪烁
扫描二维码
随时随地手机看文章
使用InvalidateRect(rect) 防止图片移动时发生闪烁 标签: imagedistance图形nullup 2011-08-10 16:56 6275人阅读 评论(1) 收藏 举报分类:
版权声明:www.gudianxiaoshuo.com 原创文章版权 -- 古典小说网
Invalidate(); 执行时,是先用背景刷清屏以后,再重新绘画
InvalidateRect(rect), 他执行时, rect区域以背景刷清屏,rect以外的区域不调用背景刷,而是将屏幕上现有的内容(如图片图形等)作为背景,在这个背景上直接画图。
若是,图片和背景反差很大,则使用Invalidate() 会发生闪烁
而使用Invalidate(rect), 则可以将闪烁降低到图片的边缘位置
具体方法如下:
平移时,如果直接翻盖原来的图片,则不会闪烁,但是这时,图片移动后,原图片的边缘位置已经无效,可是由于我们没有清屏,所以它还显示在图片上,这是不应该的。
如果能让图片直接覆盖原有的图片,并且,又让图片失效的边缘部分清屏的话,那我们就可以解决这个问题了。
首先, 我们确定好边缘处需要刷新的区域shuanxinRect
然后,调用InvalidateRect(rect) 即可
注意,移动时,不要使的整个客户区clientRect都清屏,因为那样,会产生闪烁。
我们的原则是:改直接覆盖的,则直接覆盖,改清屏的则清屏
同时,要注意:InvalidateRect(rect) 使用的是对话框的坐标系,而不是绘图控件的坐标系。
所以,若是两坐标系不同的话,先要通过 kongJian->ClientToScreen(&rect); this->ScreenToClient(&rect) 进行转换,转换完毕后,才可以调用InvalidateRect(rect);
下面是我在项目中摘取的一段示例程序:使用四个方向键来控制图片的平移
[cpp] view plain copy void CShowImageDlg::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) { // TODO: 在此添加消息处理程序代码和/或调用默认值 switch (nChar) { case VK_LEFT: m_isKeyMoving=TRUE; if(!m_lock) //移动图片 用方向键控制移动图片 { GetDlgItem(IDC_MOVE)->SetFocus(); CRect rect; m_RectTracker.GetTrueRect(&rect); m_RectTracker.m_rect.SetRect(rect.TopLeft().x-10,rect.TopLeft().y,rect.BottomRight().x-10,rect.BottomRight().y); m_RectTracker.GetTrueRect(&rect); // 调整以后,取得的新矩形位置 m_pGraphics->DrawImage(m_pImageObj,rect.TopLeft().x,rect.TopLeft().y,rect.Width(),rect.Height()); CRect clientRect; m_image.GetClientRect(&clientRect); CRect shuanxinRect; if (rect.BottomRight().x