技术内幕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 图象会有严重的拖影.加上这三行代码,也会有少量的拖影.

解决方案 »

  1.   

    InvalidateRect使区域无效,使图象重绘
    m_pointTopLeft=point-m_sizeOffset;就是在改变位置了啊
      

  2.   

            m_pointTopLeft=point-m_sizeOffset;
            dc.DPtoLP(&m_pointTopLeft);
            CRect rectNew(m_pointTopLeft,m_sizeEllipse);
            dc.LPtoDP(rectNew);
            InvalidateRect(rectNew,TRUE);
    我想是这些的作用吧,我也看不懂,跟你一起顶
      

  3.   


    可不可以认为InvalidateRect(rectOld,TRUE)让rectOld区域无效了,但系统保存了rectOld区域的"内容",却没有"重画
    InvalidateRect(rectNew,TRUE)让新的区域无效而重画,重画的是却是原来的"内容"?写完这句话,又感觉不可能,呵呵,无效就会"重画",二个InvalidateRect,就是二个地方"重画"又何来移动?(当然,事实是移动了,当然是我理解错了,但却不明白为什么)谢谢大家的好心.
      

  4.   

    有点不明白你的意思,InvalidateRect()是使窗口无效,会向窗口发送消息WM_PAINT..
    要想实现图像动画,就得更新图像的位置,再绘制图像.
      

  5.   

    rectOld保存的只是原来的区域,也就是那个长方形的大小和位置,并没保存它显示的内容.
    要在新的位置绘制新图像,就得有新的数据来填充这块新区域!!