几点对设备坐标和逻辑坐标的理解和疑问,请高手指点迷津!我认为挺抽象的!

时间:2022-06-02 19:01:36
1. 所有作图函数,如MoveTo等都使用逻辑坐标;而设备坐标是用于窗口管理
函数,如SetWindowPos();鼠标点击获得的也是设备坐标
2. 如果逻辑映射方式选用MM_TEXT,那么逻辑坐标和设备坐标是一样的,只是逻辑
坐标的y轴取向上增大,和设备坐标相反,他们的起点是一样的,如果用:
MoveTo(0,0)点开始画线,也就是从屏幕的最左上角开始,那么我看到一些书上也
是用MM_TEXT,为什么会有两个原点的偏移量?
3.如果不用系统提供的LPtoDP和DPtoLP函数,那么在MM_TEXT的映射模式下,该怎
样自己写这两个函数?

7 个解决方案

#1


转贴:
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英寸(一个逻辑单位)中水平像素数。 

#2


studing

#3


http://www.csdn.net/Expert/TopicView1.asp?id=927473

#4


什么情况下会要把逻辑转为设备?我觉得只有画图时要把设备转为逻辑

#5


gz

#6


我也觉得理解不好
<<Windows程序设计>>讲了一大通
<<深入浅出MFC>>讲得比较形象

#7


深入浅出哪一章了?我多没看到,呵呵~

一般用用逻辑坐标的情况是你用CDC成员函数参数的时候,其他一般是用设备坐标

这一句基本上够用了

#1


转贴:
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英寸(一个逻辑单位)中水平像素数。 

#2


studing

#3


http://www.csdn.net/Expert/TopicView1.asp?id=927473

#4


什么情况下会要把逻辑转为设备?我觉得只有画图时要把设备转为逻辑

#5


gz

#6


我也觉得理解不好
<<Windows程序设计>>讲了一大通
<<深入浅出MFC>>讲得比较形象

#7


深入浅出哪一章了?我多没看到,呵呵~

一般用用逻辑坐标的情况是你用CDC成员函数参数的时候,其他一般是用设备坐标

这一句基本上够用了