请问如何在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()函数中

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

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

要如何才能实现矩形框的实时更新而且把之前画的矩形框都去掉?
...全文
139 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
324234234134 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应该可以抹去之前的矩形。
但是效率很低。

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧