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里就出现这样了。 展开
{
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里就出现这样了。 展开
3个回答
展开全部
首先.这种高速刷新的画图要用双缓冲绘图.将画图工作本身放在OnPaint里面用CPainDc画,在OnTimer里只对缓冲位图做修改.再Invalidate().使用窗口DC画图不可以放在OnTimer里面.包括CDC* pdc=GetWindowDc()/CCilentDC(this)等等.都尽量不要直接在外面画.尤其是不要高速画,.
其次,擦除特别频繁造成图像闪烁严重的时候可以截取WM_ERASEBKGND消息(MFC里的OnEraseBkgnd函数),将默认的CDialog::OnEraseBkgnd去掉直接return TRUE;防止多重重复刷新.就可以不会那么快闪烁了.
其次,擦除特别频繁造成图像闪烁严重的时候可以截取WM_ERASEBKGND消息(MFC里的OnEraseBkgnd函数),将默认的CDialog::OnEraseBkgnd去掉直接return TRUE;防止多重重复刷新.就可以不会那么快闪烁了.
展开全部
我觉得有痕迹主要是因为你把位图画到一个新的位置之后,原来的那个位图所在区域没有被及时覆盖。你可以这样试试,你移动位图之前,先将新的位图所在的占的区域与旧的位图所占的区域的交集部分(如果有交集的话,没有的话就是全部的旧的位图所在的区域)用画刷覆盖掉(比如用FillRect()函数)。然后再把位图贴到新的位置。这样因为交集部分被擦除,就应该看不到拖影了。希望对你有帮助。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
图形自然不能画在onTimer那里。。那哪看的清啊。。要放在OnPaint里边啊,OnTimer只是用来改变位置的。。这样才行。。
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询