一直对这个问题搞不懂啊,逻辑坐标和设备坐标分别是什么?窗口和视口有什么区别?怎么书上说不管对窗口和视端口原点作什么改变,设备点(0,0)始终是显示区域的左上角?设备点和显示区域又是什么关系?窗口坐标原点和视口坐标原点都是指的哪个地方?

解决方案 »

  1.   

    他们的原点不一样,逻辑坐标以某个矩形(一般为窗口区域)的左上角为原点,而设备坐标一般以屏幕或打印机的作图区域左上角为原点。 简单说,设备坐标是你的显示器能表示的坐标,大小与分辨率有关。   
      逻辑坐标就是一个虚拟的概念,没有边界,但是不肯能一下子在屏幕上表示,只能一屏一屏的来。   
        
      比如,在绘图的过程中,当你把一个屏的图形移动到屏幕左边之后,你当前所在的屏幕坐标就不是初始状态了,而计算机不知道,可以使用DPtoLp()把当前的屏幕坐标转换为逻辑坐标,否则当你再把第一屏的数据移动过来后,两屏的数据会重合的。
      

  2.   

    视口对应设备坐标,设备坐标系是坐标原点O(0,0)总是在左上角位置,水平向右X递增,垂直向下Y弟增;   
        
    窗口对应逻辑坐标
    你在网上搜一下,有好多是关于这方面的介绍
      

  3.   

    经过一上午的研究,目前的体会是:
    设备坐标就是你创建出来的窗口那个坐标,其原点始终在(0,0),即窗口左上角,
    逻辑坐标就是你GDI函数(绝大部分)中使用的坐标,它是一个虚拟的"窗口",仅仅为了让你画图方便
    使用了GDI函数后这里指定的逻辑坐标Windows在实际输出到窗口上时将其转换为设备坐标,这时映像模式派上用途了,
    设置"窗口"坐标原点(逻辑坐标)方法:
    1 CRect rect;
     GetClientRect (&rect);
     dc.SetMapMode (MM_LOENGLISH);
     dc.SetViewportOrg (rect.Width () / 2, rect.Height () / 2);2 CRect rect;
     GetClientRect (&rect);
     CPoint point (rect.Width () / 2, rect.Height () / 2);
     dc.SetMapMode (MM_LOENGLISH);
     dc.DPtoLP (&point);
     dc.SetWindowOrg (-point.x, -point.y);两种方法都是将"窗口"坐标(逻辑坐标)原点设置为客户区中央,但是需要注意的是在使用SetWindowOrg时坐标值必须是逻辑坐标,因此需要dc.DPtoLP (&point),而在使用SetViewportOrg时则不需,因为这个函数使用的坐标值是设备坐标值。总结:设置逻辑坐标原点用SetViewportOrg最好,其中指定的x,y即是最后逻辑坐标原点的值,在这个基础上使用GDI函数即是。