近日看了programming windows with MFC 第二版 对于其中的logical、device坐标究竟代表什么,还有setviewportext() setviewportorg() setwindowext()setwindoworg()函数到底是干什么的,如何使用.实在看不懂,以及那两个坐标转换函数LPtoDP(),DPtoLP()也是不明不白的..
恳请哪位高手给我指点迷津啊..

解决方案 »

  1.   

    函数功能:该函数用指定的坐标设置设备环境的窗口原点。    函数原型:BOOL SetWindowOrgEx(HDC hdc, int X, int Y, LPPOINT lpPoint);    参数:    hdc:指向设备环境的句柄。    X:指定新窗口原点的逻辑X坐标。    Y:指定新窗口原点的逻辑Y坐标。    lpPoint:指向POINT结构的指针,先前的窗口原点存放在此结构中,如果lpPoint的值为NULL,则什么也没返回。    返回值:如果函数调用成功,返回值为非零值,否则为零。    速查:Windows NT:3.1及以上版本;Windows:95及以上版本;Windows CE:不支持;头文件:wingdi.h;库文件:gdi32.lib。
      

  2.   

    函数功能:该函数把逻辑坐标转换为设备坐标,此转换依赖于设备环境的映射方式,原点的设置、窗口和观察口的范围及全局转换。    函数原型:BOOL LptoDP(LPPOINT lpPoints, int nCount, HDC hdc);    参数:    hdc:指向设备环境的句柄。    lpPoints:指向POINT结构数组的指针,每一个POINT结构中的X坐标和Y坐标将被转换。    nCount:指定数组中点的数目。    返回值:如果函数调用成功,返回值为非零值,否则为零。    注释:如果逻辑坐标超过32位,或如果转换的设备坐标超过27位,那么该函数调用失败,在此溢出的情况下,所有点的结果是未定义的。
      

  3.   

    函数功能:该函数将设备坐标转变为逻辑坐标,转变依赖于设备的图形模式,窗口和坐标的起点及范围的设置,和转换的内容。    函数原型:BOOL DptoLP(HDC hdc, LPPOINT lpPoints, int nCount);    参数:    hdc:指向设备环境的句柄。    lpPoints:指向POINT结构数组的指针,每个POINT结构中的X和Y坐标将被转换。    NCount:规定数组中点的数目。    返回值:如果函数调用成功,返回值为非零值。否则为零。    Windows NT:若想获得更多错误信息,请调用GetLastError函数。    注释:如果设备坐标超过27位或如果转换的逻辑坐标超过32位,DptoLP函数调用失败,在溢出的情况下,所有点的结果不能定义。    速查:Windows NT:3.1及以上版本;Windows:95及以上版本;Windows CE:不支持;头文件:wingdi.h;库文件:gdi32.lib。
      

  4.   

    logical是逻辑坐标、device是设备坐标
    如果你的视有滚动条,你就明白两者的差别了
      

  5.   

    VC中的坐标系统分为逻辑坐标和设备坐标,逻辑坐标就是内存中虚拟的坐标,可以理解为看不见的,而设备坐标就是跟具体的设备相联系
    的坐标系统,如:显示器和打印机等。不同的映射模式决定了设备坐标和逻辑坐标之间的转换关系,也就是两种坐标系统在相互转换时,逻辑
    单位和设备单位之间的某种比例关系。这里需要说明的是:Windows中,只有对需要设备环境句柄作参数的GDI函数,映射方式才会起作用。
    对于视口和窗口的概念比较的容易混淆,其实窗口和视口是与映射模式相关联的:映射方式就是用于从"窗口"(逻辑坐标)到"视口"(设备坐
    标)的映射。"视口"是基于设备坐标的,通常,视口与客户区相同;"窗口"是基于逻辑坐标的,逻辑坐标可以是像素、毫米、英寸等。
    下面的公式是将窗口(逻辑)坐标转化为视口(设备)坐标: 
     
    xViewport = (xWindow - xWinOrg)*xViewExt/xWinExt + xViewOrg
    yViewport = (yWindow - yWinOrg)*yViewExt/yWinExt + yViewOrg
    (xWindow,yWindow)是待转换的逻辑点,(xViewport,yViewport)是转换后的设备坐标。 
    设备坐标的视口原点(xViewOrg,yViewOrg)和逻辑坐标的窗口原点(xWinOrg,yWinOrg)默认情况下均被设置成(0,0),但具体情况下可以改变;
    (xWinExt,yWinExt)是逻辑坐标的窗口范围;(xViewExt,yViewExt)是设备坐标的窗口范围,在多数映射方式下,范围是映射方式所隐含的,
    不能改变。注意:每个范围自身没有什么意义,但是视口范围和窗口范围的比是逻辑单位转换为设备单位的换算因子。例如,
    对于MM_LOENGLISH模式,xViewExt/xWinExt 表示每0.01英寸(一个逻辑单位)中水平像素数。 
    VC中的坐标系统分为逻辑坐标和设备坐标,逻辑坐标就是内存中虚拟的坐标,我们可以理解为看不见的,而设备坐标就是跟具体的设备相联系
    的坐标系统,如:显示器和打印机等。不同的映射模式决定了设备坐标和逻辑坐标之间的转换关系,也就是两种坐标系统在相互转换时,
    逻辑单位和设备单位之间的某种比例关系。这里需要说明的是:Windows中,只有对需要设备环境句柄作参数的GDI函数,映射方式才会起作用。
    对于视口和窗口的概念比较的容易混淆,其实窗口和视口是与映射模式相关联的:映射方式就是用于从"窗口"(逻辑坐标)到"视口"(设备坐标)
    的映射。"视口"是基于设备坐标的,通常,视口与客户区相同;"窗口"是基于逻辑坐标的,逻辑坐标可以是像素、毫米、英寸等。
    下面的公式是将窗口(逻辑)坐标转化为视口(设备)坐标: 
     
    xViewport = (xWindow - xWinOrg)*xViewExt/xWinExt + xViewOrg
    yViewport = (yWindow - yWinOrg)*yViewExt/yWinExt + yViewOrg
    (xWindow,yWindow)是待转换的逻辑点,(xViewport,yViewport)是转换后的设备坐标。 
    设备坐标的视口原点(xViewOrg,yViewOrg)和逻辑坐标的窗口原点(xWinOrg,yWinOrg)默认情况下均被设置成(0,0),但具体情况下可以改变;
    (xWinExt,yWinExt)是逻辑坐标的窗口范围;(xViewExt,yViewExt)是设备坐标的窗口范围,在多数映射方式下,范围是映射方式所隐含的,
    不能改变。注意:每个范围自身没有什么意义,但是视口范围和窗口范围的比是逻辑单位转换为设备单位的换算因子。
    例如,对于MM_LOENGLISH模式,xViewExt/xWinExt 表示每0.01英寸(一个逻辑单位)中水平像素数。
      

  6.   

    alien_taiji(笑了) ,你说的“每个范围自身没有什么意义,但是视口范围和窗口范围的比是逻辑单位转换为设备单位的换算因子。”,是不是就是说,xviewext和xwinext具体数值一点用没有,只是二者的比值才有意义??
    还有“窗口”和“视口”是不是分别指window和viewport??通过你说的,我了解了什么是设备坐标,可是既然既然有了设备坐标,而逻辑坐标是内存中的虚拟坐标,那么逻辑坐标是干什么的呢?可以的话,你可不可以举个例子来具体说明一下这两种坐标以及我先前提到的函数的用法??
      

  7.   

    函数中point参数对应的都是窗口的设备坐标,我们应该将设备坐标和逻辑坐标相区别,由于窗口使用了滚动条,所以传入的设备坐标是对应于当前窗口左上角的坐标,没有考虑是否滚动,而逻辑坐标必须考虑滚动后对应的坐标。所以看得出同一点在滚动后的坐标值是不同的,这一规则同样适用于改变了映射方式的窗口,假设你将映射方式设置为每点为0.01毫米,那么设备坐标所对应的逻辑坐标也需要重新计算。进行这种转换需要写一段代码,所幸的是系统提供了进行转换的功能DC的DPtoLP,LPtoDP,