逻辑坐标与设备坐标有什么区别,为什么要相互转化,希望能有清晰的解释

解决方案 »

  1.   

    VC中的坐标系统分为逻辑坐标和设备坐标,逻辑坐标就是内存中虚拟的坐标,我们可以理解为看不见的,而设备坐标就是跟具体的设备相联系的坐标系统;
    在程序中,所有传递给MFC作图的坐标都是逻辑坐标,也可以认为CDC的所有成员函数都以逻辑坐标作为其参数,CWnd的成员函数都以设备坐标为其参数;
    逻辑坐标和设备坐标之间的转换工作可以通过CDC提供了两个成员函数LPToDP和DPToLP来完成
      

  2.   


    void CDrawView::InvalObj(CDrawObj *pObj)
    {
    CRect rect = pObj->m_position;
    DocToClient(rect);
    if (m_bActive && IsSelected(pObj))
    {
    rect.left -= 4;
    rect.top -= 5;
    rect.right += 5;
    rect.bottom += 4;
    }
    //Increases the width and height of CRect.
    rect.InflateRect(1, 1); // handles CDrawOleObj objects //定义区域,重绘该区域
    InvalidateRect(rect, FALSE);
    }这是DrawCli示例里的一个函数,能不能给讲讲这个函数是什么意思?
      

  3.   

    这里是GDI裁剪的运用,InvalidateRect是把参数中的矩形作为剪裁区域来刷新视图,GDI设备描述表中只输出剪裁区域内的绘制,这样可以提高程序的输出效率,因为例子中,更改的只是一个图形对象,那么理论上在设备描述表的输出的底层只需要重绘这个对象。这是这个函数的目的为什么要转换坐标?因为剪裁区域只支持设备坐标,可以查看API函数SelectClipRgn()。MSDN的有一段说明:
    The SelectClipRgn function assumes that the coordinates for a region are specified in device units. 
      

  4.   

    但为什么对rect要进行这样的操作呢? 
            rect.left -= 4;
            rect.top -= 5;
            rect.right += 5;
            rect.bottom += 4;        rect.InflateRect(1, 1);
      

  5.   

    因为rect是图形本身大小,不忘了,当你编辑图形的时候,还有那几个黑色的控制点啊,你可以尝试这4,5改小,或者干脆不要这几句,你会发现再编辑有会有残余。
      

  6.   

    a) 可以认为CDC的所有成员函数都以逻辑坐标为参数;
    b) 可以认为CWnd的成员函数都以设备坐标为参数;
    c) 所有选中测试操作都应该考虑设备坐标,区域的定义该采用设备坐标,如Crect::PtInRect之类的函数只有在采用设备坐标参数时才会保证有正确的结果;
    d) 将一些需要长期使用的值用逻辑坐标来保存,如果采用设备坐标来保存某点的坐标的话,那么只要用户对窗口进行以下滚动,该点的坐标就不再有效了。
      

  7.   

    逻辑坐标:可以理解成为我们用数学的方法表示图形的时候的坐标。那一挑线段ab来说 通常来说 ab的信息都是用坐标来给出的。实际上这里面有一个前提----那就是这个ab已经在一个坐标系中了。这个坐标系就可以看成是逻辑坐标系。在这个坐标系下面的ab的坐标就可以看成是逻辑坐标。当然我们在表示这个ab的时候要把这个图形显示到显示器上。这个时候我们需要做的是怎么在显示器上把逻辑坐标系和绑定在其中的ab显示出来。通常涉及到三方面的问题。逻辑坐标的原点显示在屏幕的什么地方;逻辑坐标的一个单位用几个像素来表示;逻辑坐标系的正方向是什么。简单举个例子  逻辑坐标系的原点选择在屏幕左下角,向右,向上为正方向,单位长度用两个像素长度表示。这时候两个坐标系在一个平面中了。那么一个点在屏幕坐标系下面有一个坐标。在逻辑坐标系下面有一个坐标。这两个坐标可以相互转化。
    我说明白没?