CClientDC dc(this);
    OnPrepareDC(&dc);
    CRect rectOld(m_pointTopLeft,m_sizeEllipse);
 (1)dc.LPtoDP(rectOld);
 (2)InvalidateRect(rectOld,TRUE);
    m_pointTopLeft=point-m_sizeOffset;
    dc.DPtoLP(&m_pointTopLeft);
    CRect rectNew(m_pointTopLeft,m_sizeEllipse);
(3)dc.LPtoDP(rectNew); 
 (4)InvalidateRect(rectNew,TRUE);我的映射模式是MM_LOENGLISH.1.请帮我解释一下(1)与(3)为什么要转换成设备坐标?2.还有InvalidateRect()函数在这里的作用?3.InvalidateRect()的形参应该是逻辑坐标下的东西,而rectnew经转换不是变成设备坐标了吗?为什么也可以做InvalidateRect()的形参?4.我把第(3)个删除也可以运行出来。请问删与不删有什么区别?

解决方案 »

  1.   

    1.你可以测试下不转换与转换有什么区别.再想原因就容易了,要转换,说明它们坐标原点是不同的,即坐标空间不同,所以要转换.
    (注:这个去看孙鑫相关教程http://www.pconline.com.cn/pcedu/empolder/gj/vc/0607/820674.html
    第5,10,11章中一处有讲,具体是哪章,忘了)2.InvalidateRect()是告诉系统重绘一个矩形区域,(注:这个MSDN上有详细说明)3.InvalidateRect只关心传入的那个值,至于这个值是什么坐标,它并不知道,也不关心. 他都会把这个坐标值按自己的方式进行转换,具体怎么转换,就不知道了.4.删不删都一样的话,只能说明没有区别了.(按事实说话)
      

  2.   


    同感,楼主还是多看看 MSDN