关于使用BitBlt()函数画动态图时,刷新跟不上的问题???

watanou 2005-04-25 10:15:42
我今天做一个很简单的动画,就是用用定时器不断发送OnTimer消息来画图,就是想产生小球的移动效果,但结果是小球移动以后的轨迹会留下未刷新的小球的痕迹,是不是刷新跟不上的问题啊,该怎么解决啊?请大虾指教!
void CMainFrame::OnTimer(UINT nIDEvent)
{
dc.BitBlt(ball_x,ball_y,rect.right,rect.bottom,mdc,0,0,SRCCOPY);
ball_x+=ball_vx;
ball_y+=ball_vy;
if(ball_x>rect.right)
{
ball_vx=-ball_vx;
ball_x=rect.right-60;
}
if(ball_x<rect.left)
{
ball_vx=-ball_vx;
ball_x=60;
}
if(ball_y<0)
{
ball_vy=-ball_vy;
ball_y=60;
}
if(ball_y>rect.bottom)
{
ball_vy=-ball_vy;
ball_y=rect.bottom-60;
}
}
...全文
225 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
mynetpc 2005-05-07
  • 打赏
  • 举报
回复
vfw
YanDong_8212 2005-04-30
  • 打赏
  • 举报
回复
InvalidateRect()是对无效区域的重绘,另一个不管这些。
详细的资料可以查MSDN或者参考书
watanou 2005-04-27
  • 打赏
  • 举报
回复
我后来用InvalidateRect()函数把每次贴图之前的区域给刷新掉,解决问题了!
不过今天我又遇到一个问题,就是我创建一个无视图/文档结构的程序,然后我在CFrameWnd::onPaint()函数里画图,就是显示不出来,然后我先是用Invalidate()函数刷新,结果是图画出来了,但是视图的背景透空掉了,然后我又试了一下UpdateWindow(),结果是可以的!但我现在搞不清楚,这两个刷新函数的区别,请各位指教,不甚感激!
dfyang 2005-04-26
  • 打赏
  • 举报
回复
在OnDraw或者OnPaint里画图
在OnTimer里调用Invalidate
watanou 2005-04-26
  • 打赏
  • 举报
回复
各位高手指点一下啊?不甚感激啊!
织梦科技 2005-04-26
  • 打赏
  • 举报
回复
在前面加一句:UpdateWindow();.(我在网吧,不一定写对)
农叔叔 2005-04-26
  • 打赏
  • 举报
回复
要存上次你ball区所在的坐标,用底色覆盖然后再贴图,
如果你有几个贴图,最好是再设个缓冲暂存,不然会闪。
maibishinian 2005-04-26
  • 打赏
  • 举报
回复
在dc.BitBlt(ball_x,ball_y,rect.right,rect.bottom,mdc,0,0,SRCCOPY)之前先把rect区域用底色覆盖.
watanou 2005-04-26
  • 打赏
  • 举报
回复
todfyang():
我试过了,也不行啊!
那我在在OnTimer()里画应该是一样的啊,每次画之前都先Invalidate().可就是不对啊!
viewerviewer 2005-04-25
  • 打赏
  • 举报
回复
在BitBlt()前面加.,试试...
watanou 2005-04-25
  • 打赏
  • 举报
回复
那就看不见了啊,不行啊!
viewerviewer 2005-04-25
  • 打赏
  • 举报
回复
加一句:Invalidate(),不知可否?...

19,469

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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