请问如何在OnDraw() 里面刷新 GDI 画的图像?

andynjust 2009-08-07 09:03:27
我在 OnDraw() 函数里显示了一幅 BMP 图像,然后用 GDI 来绘制一个固定大小的矩形框,

我想实现的是每次鼠标移动,都以鼠标当前在的 位置为 矩形框的左上角坐标,重新画矩形,

我是把 画矩形的代码放在鼠标移动的响应函数中的:

void CMyView::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default

ax=0;
ay=0;

ax=point.x;
ay=point.y;

//////////////////////////////////////
//画矩形
CDC* pDC=GetDC();

CPen pen(PS_SOLID,3,RGB(255,0,0));
CPen* OldPen=pDC->SelectObject(&pen);
pDC->Rectangle(ax,ay,ax+180,ay+114);
pDC->SelectObject(OldPen);



///////////////////////////////////////
CScrollView::OnMouseMove(nFlags, point);
}




这样是可以每次鼠标移动都画矩形,但是之前画的那些矩形框都还在,

请问怎么样才可以把之前画的矩形框全都删除?只保留当前最新画的这个?

我试过,要是把画矩形框的代码放到 OnDraw() 函数中,在OnMouseMove()函数中

更新矩形左上角的坐标值,但是这样的话,画面上就只剩下第一次画的那个矩形框,

鼠标移动后,画面上都不显示第一次之后画的矩形框,

要如何才能实现矩形框的实时更新而且把之前画的矩形框都去掉?
...全文
111 点赞 收藏 10
写回复
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
LintChD 2009-08-07
设置反色SetROP2(hdc,R2_NOT) ;
原位置从新画就能擦出了
回复
andynjust 2009-08-07
[Quote=引用 8 楼 shakeyou123 的回复:]
那就不要整个客户区都刷新,用InvalidateRect把不需要刷新的地方置成无效就可以了
[/Quote]

但是,我想实现的是鼠标在整个客户区都可以移动啊,那哪里有无效区啊,整个区都有可能要重画的,难道要每次都判断前一次鼠标的位置,然后再设定一个合理的范围来刷新?
回复
shakeyou123 2009-08-07
那就不要整个客户区都刷新,用InvalidateRect把不需要刷新的地方置成无效就可以了
回复
Ryanwen 2009-08-07
[Quote=引用 5 楼 andynjust 的回复:]
如果我在 OnMouseMove()函数或者是 OnTimer() 函数中调用Invalidate 来刷新的话,
画面闪烁的很厉害啊,这个怎么解决?

谢谢各位!
[/Quote]
使用InvalidateRect来设置无效区域,不整个客户区更新
使用双缓冲
回复
雪影 2009-08-07
使用双缓冲技术,相关代码google一下,很多的
回复
andynjust 2009-08-07
[Quote=引用 4 楼 danxuezx 的回复:]
引用 2 楼 ryanwen 的回复:
画矩形框的代码放到 OnDraw() 函数中
在OnMouseMove()函数中更新矩形左上角的坐标值,然后调用Invalidate/InvalidateRect更新重画

up,是这样的,我做过这样的东西,我是用鼠标移动一幅图片。
[/Quote]

如果我在 OnMouseMove()函数或者是 OnTimer() 函数中调用Invalidate 来刷新的话,
画面闪烁的很厉害啊,这个怎么解决?

谢谢各位!
回复
danxuezx 2009-08-07
[Quote=引用 2 楼 ryanwen 的回复:]
画矩形框的代码放到 OnDraw() 函数中
在OnMouseMove()函数中更新矩形左上角的坐标值,然后调用Invalidate/InvalidateRect更新重画
[/Quote]
up,是这样的,我做过这样的东西,我是用鼠标移动一幅图片。
回复
jasonM2008 2009-08-07
[Quote=引用 1 楼 tttyd 的回复:]
Rectangle之前调用一次Invalidate应该可以抹去之前的矩形。
但是效率很低。

[/Quote]
正解!
回复
Ryanwen 2009-08-07
画矩形框的代码放到 OnDraw() 函数中
在OnMouseMove()函数中更新矩形左上角的坐标值,然后调用Invalidate/InvalidateRect更新重画
回复
雪影 2009-08-07
Rectangle之前调用一次Invalidate应该可以抹去之前的矩形。
但是效率很低。
回复
发动态
发帖子
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
社区公告
暂无公告