最近在看VC++技术内幕这本书,对于逻辑与设备坐标转换的部分不是很清楚。在处理对象时,有时用设备坐标,有时用逻辑坐标,请问哪些情况下用设备坐标,哪些情况下用逻辑坐标呢?请指点!
比如说书上P91页的例EX05C的程序中1.2.3.4.5.所示的地方为什麽需要这样转换呢?void CEx05cView::OnLButtonDown(UINT nFlags, CPoint point) 
{
    CRect rectEllipse(m_pointTopLeft, m_sizeEllipse); // still logical
    CRgn  circle;    CClientDC dc(this);
    OnPrepareDC(&dc);
    dc.LPtoDP(rectEllipse); ---------------------------------1.
    circle.CreateEllipticRgnIndirect(rectEllipse);
    if (circle.PtInRegion(point)) {
        SetCapture();
        m_bCaptured = TRUE;
        CPoint pointTopLeft(m_pointTopLeft);
        dc.LPtoDP(&pointTopLeft);----------------------------2.
        m_sizeOffset = point - pointTopLeft;         
        ::SetCursor(::LoadCursor(NULL, IDC_IBEAM ));
    }
}void CEx05cView::OnMouseMove(UINT nFlags, CPoint point) 
{
    if (m_bCaptured) {
        CClientDC dc(this);
        OnPrepareDC(&dc);
        CRect rectOld(m_pointTopLeft, m_sizeEllipse);
        dc.LPtoDP(rectOld);------------------------------------3.
        InvalidateRect(rectOld, TRUE);
        m_pointTopLeft = point - m_sizeOffset;
        dc.DPtoLP(&m_pointTopLeft);----------------------------4.
        CRect rectNew(m_pointTopLeft, m_sizeEllipse);
        dc.LPtoDP(rectNew);------------------------------------5.
        InvalidateRect(rectNew, TRUE);
    }
}

解决方案 »

  1.   

    首先,弄清楚什么是逻辑坐标,什么是设备坐标
    其次,想想哪些时候能用到设备坐标,比如对DC,只有附着于可见窗口的DC才和设备坐标能联系起来,所以一般来说都是逻辑坐标,而需要的时候再LPtoDP;再比如鼠标位置,因为是直接在显示器上反映的,所以常见的是设备坐标。一般来说,大致都可以判断的。有些函数的坐标系不是很好判断的时候,就需要用MSDN了。
      

  2.   

    设备坐标(又称物理坐标)
    设备坐标是描述在屏幕和打印机显示或打印的窗体的一种坐标体系。默认的坐标原点是在其客户区的左上角。X轴向右为正,Y轴向下为正。度量单位为象素。原点和坐标轴方向可以改变,但是度量单位不可以改变。逻辑坐标
    逻辑坐标是在程序中控制显示,打印使用的坐标体系。该坐标系与定义的映射模式密切相关。默认的映射模式是MM_TEXT。我们可以通过设置不同的映射模式来改变该坐标体系的默认行为。
    在默认映射模式MM_TEXT下,一个逻辑单位对应于设备坐标下的一个象素
      

  3.   

    参考下面的:
    http://dev.yesky.com/121/2018121.shtml
      

  4.   

    我的概念:用GDI画图写字参数都是用逻辑坐标.和硬件打交道的参数多半用物理坐标.
      

  5.   

    gdi函数的坐标都是逻辑坐标
    然后要把内容画在输出设施上的时候,就需要转成设备坐标,然后画在设备上