MFC中bmp位图移动时后面有痕迹?怎么清除?

voidCSnowflakesView::OnTimer(UINTnIDEvent){CRectrect;GetClientRect(rect);CDC*pDC=GetW... void CSnowflakesView::OnTimer(UINT nIDEvent)
{

CRect rect;
GetClientRect(rect);
CDC *pDC = GetWindowDC();
if(nIDEvent==1)
{
snow1x=100;
snow1y+=2;
if(i==0)
{
Draw(0,n,pDC,snow1x,snow1y);
}
if(i==1)
{
Draw(1,n,pDC,snow1x,snow1y);
i=-1;
}
if(snow1y>=rect.bottom)
{snow1y=0;}
if(snow1x<=rect.left)
{snow1x=rect.right-20;}
if(snow1x>=rect.right)
{snow1x=0;}
i++;
//Invalidate();
}
CView::OnTimer(nIDEvent);
}
用Invalidate()的话就图片刷新很厉害,基本看不到了。怎么样去除后面下落痕迹?
我也是用内存缓冲画的图,就是想把绘图那部分放在ontimer里就出现这样了。
展开
 我来答
ExcaliburZ
2011-04-16 · TA获得超过1102个赞
知道小有建树答主
回答量:750
采纳率:0%
帮助的人:804万
展开全部
首先.这种高速刷新的画图要用双缓冲绘图.将画图工作本身放在OnPaint里面用CPainDc画,在OnTimer里只对缓冲位图做修改.再Invalidate().使用窗口DC画图不可以放在OnTimer里面.包括CDC* pdc=GetWindowDc()/CCilentDC(this)等等.都尽量不要直接在外面画.尤其是不要高速画,.
其次,擦除特别频繁造成图像闪烁严重的时候可以截取WM_ERASEBKGND消息(MFC里的OnEraseBkgnd函数),将默认的CDialog::OnEraseBkgnd去掉直接return TRUE;防止多重重复刷新.就可以不会那么快闪烁了.
li668xiao
2011-04-16 · TA获得超过611个赞
知道小有建树答主
回答量:412
采纳率:61%
帮助的人:252万
展开全部
我觉得有痕迹主要是因为你把位图画到一个新的位置之后,原来的那个位图所在区域没有被及时覆盖。你可以这样试试,你移动位图之前,先将新的位图所在的占的区域与旧的位图所占的区域的交集部分(如果有交集的话,没有的话就是全部的旧的位图所在的区域)用画刷覆盖掉(比如用FillRect()函数)。然后再把位图贴到新的位置。这样因为交集部分被擦除,就应该看不到拖影了。希望对你有帮助。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
敛正雅7f
2011-04-16 · TA获得超过2031个赞
知道大有可为答主
回答量:1553
采纳率:0%
帮助的人:1756万
展开全部
图形自然不能画在onTimer那里。。那哪看的清啊。。要放在OnPaint里边啊,OnTimer只是用来改变位置的。。这样才行。。
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式