技术内幕Ex06c中的一些代码,不太明白,它是怎么实现图象移动的?void CEx06cView::OnMouseMove(UINT nFlags, CPoint point)
{
if(m_bCaptured)
{
CClientDC dc(this);
OnPrepareDC(&dc);//设置视图的映射模式和坐标原点
CRect rectOld(m_pointTopLeft,m_sizeEllipse);
dc.LPtoDP(rectOld);
InvalidateRect(rectOld,TRUE);//background is erased
m_pointTopLeft=point-m_sizeOffset;
dc.DPtoLP(&m_pointTopLeft);
CRect rectNew(m_pointTopLeft,m_sizeEllipse);
dc.LPtoDP(rectNew);
InvalidateRect(rectNew,TRUE);
}
}
还有,这个代码如果少了CRect rectOld(m_pointTopLeft,m_sizeEllipse);
dc.LPtoDP(rectOld);
InvalidateRect(rectOld,TRUE);//background is erased 图象会有严重的拖影.加上这三行代码,也会有少量的拖影.
{
if(m_bCaptured)
{
CClientDC dc(this);
OnPrepareDC(&dc);//设置视图的映射模式和坐标原点
CRect rectOld(m_pointTopLeft,m_sizeEllipse);
dc.LPtoDP(rectOld);
InvalidateRect(rectOld,TRUE);//background is erased
m_pointTopLeft=point-m_sizeOffset;
dc.DPtoLP(&m_pointTopLeft);
CRect rectNew(m_pointTopLeft,m_sizeEllipse);
dc.LPtoDP(rectNew);
InvalidateRect(rectNew,TRUE);
}
}
还有,这个代码如果少了CRect rectOld(m_pointTopLeft,m_sizeEllipse);
dc.LPtoDP(rectOld);
InvalidateRect(rectOld,TRUE);//background is erased 图象会有严重的拖影.加上这三行代码,也会有少量的拖影.
m_pointTopLeft=point-m_sizeOffset;就是在改变位置了啊
dc.DPtoLP(&m_pointTopLeft);
CRect rectNew(m_pointTopLeft,m_sizeEllipse);
dc.LPtoDP(rectNew);
InvalidateRect(rectNew,TRUE);
我想是这些的作用吧,我也看不懂,跟你一起顶
可不可以认为InvalidateRect(rectOld,TRUE)让rectOld区域无效了,但系统保存了rectOld区域的"内容",却没有"重画
InvalidateRect(rectNew,TRUE)让新的区域无效而重画,重画的是却是原来的"内容"?写完这句话,又感觉不可能,呵呵,无效就会"重画",二个InvalidateRect,就是二个地方"重画"又何来移动?(当然,事实是移动了,当然是我理解错了,但却不明白为什么)谢谢大家的好心.
要想实现图像动画,就得更新图像的位置,再绘制图像.
要在新的位置绘制新图像,就得有新的数据来填充这块新区域!!