窗口坐标,逻辑坐标和视口坐标,设备坐标的区别
2012-04-01 21:06
323 查看
应该说 窗口坐标 是相对于 视口坐标 而言 逻辑坐标 是相对于 设备坐标 而言 补充: 窗口坐标是基于逻辑坐标的. 视口坐标是基于设备坐标. 上面这两话是抄自百度百科的,我的理解是: 窗口坐标的单位长度与逻辑坐标的单位长度相同,也就是说,当你在窗口坐标上画图时,传递给画图函数的参数的单位是逻辑单位。但是当windows把图形输出到屏幕上时,并不是直接把图形按照它在窗口坐标上的位置输出到屏幕上的,而是先把它在窗口坐标上的值转换成视口坐标上的值(与此同时,也把逻辑坐标按照不同的映射模式转换成设备坐标)。下面举例说明:
由于 一般情况下,窗口原点是与视口原点相同的,(也就是说,位于屏幕上的同一个位置),为了体会不窗口坐标与视口坐标的转换,先用SetwindowtOrg(100,-300)将视口移到(100,-300),这相当于把 逻辑点(100,-300)映射到设备点(0,0) (注意:如果改用SetviewportOrg移动原点,则其原点的移动尺寸与映射模式无关,其300个长度单位等于9厘米)(注:这个设备点也是相对于当前的DC而言,如果当前的DC是整个屏幕,那么设备点(100,-300)的原点就在屏幕的左上角,如果当前的DC是某个应用程序的客户区,那么设备点(100,-300)的原点就是应用程序的客户区的左上角,)
现在假设当前DC是某个应用程序的客户区,映射模式为 MM_LOMETRIC (在这种映射模式下,设备坐标以0.1 毫米为一个长度单位,Y轴的正方向为向上,也就是说,屏幕上的左上角的Y坐标为0,下面的Y坐标均小于0),当使用语句: MoveTo(100,-600); LineTo(100,-800);//Y轴负方向向下,所以用负值 进行画图时,它的转换过程如下: 1)窗口与视口坐标转换,由于窗口坐标(100,-300 ),映射为设备坐标(0,0),所 以 窗口(100,-600)映射为视口(0,-300) 窗口(100,-800)视映射为视口(0,-500)
2)逻辑与设备坐标转换 由于是 MM_LOMETRIC 映射模式,设备坐标的单位长度为 0.1mm,而在输出时用的是视口坐标,所以视口坐标(100,-600)输出到屏幕上时,该点的位置 距客户区左边 0 厘米,距客户区上边 3厘米。这就是直线的起点; 再把直线终点的视口坐标(100,-800)输出到距客户区左边0厘米,距客户区上边 5厘米处。 以上就是全部过程 在不同的映射模式下,一个逻辑单位 对应 不同的 设备单位, 例如:在 MM_TEXT 映射模式下,设备坐标是以像素为单位的, 也就是说,如果你这时要用一个函数画一条直线,并且传递给它的参数大小为
100,(通常情况下,传递给函数的参数通常是视作逻辑坐标下的数值,也就是说,这里的100指的是逻辑坐标里100个单位长度.不过也不一定,用时请看具体情况,这个我也不大清楚),那么它将会在屏幕上画一条100像素长的线条, 如果是在 MM_LOMETRIC 映射模式下,设备坐标是以0.1 毫米为一个长度单位的,如果你这时要用一个函数画一条直线,并且传递给它的参数大小为 100,那么它将会在屏幕上画出 0.1毫米 * 100 = 10 厘米 长的直线, 当然,由于各种复杂的原因,画长的直线可能并不是刚好10 厘米长,但误差不会很大
至于窗口与视口坐标的问题,你可以看这里 http://baike.baidu.com/view/1522985.htm 补充: 我的理解是这样的,窗口坐标与视口坐标是与DC(即设备上下文)相关的,如果 DC是整个屏幕,那么窗口坐标的原点就是屏幕的左上角,如果DC是一个应用程序的窗口的客户区,那么窗口坐标的原点就是该客户区的左上角
由于 一般情况下,窗口原点是与视口原点相同的,(也就是说,位于屏幕上的同一个位置),为了体会不窗口坐标与视口坐标的转换,先用SetwindowtOrg(100,-300)将视口移到(100,-300),这相当于把 逻辑点(100,-300)映射到设备点(0,0) (注意:如果改用SetviewportOrg移动原点,则其原点的移动尺寸与映射模式无关,其300个长度单位等于9厘米)(注:这个设备点也是相对于当前的DC而言,如果当前的DC是整个屏幕,那么设备点(100,-300)的原点就在屏幕的左上角,如果当前的DC是某个应用程序的客户区,那么设备点(100,-300)的原点就是应用程序的客户区的左上角,)
现在假设当前DC是某个应用程序的客户区,映射模式为 MM_LOMETRIC (在这种映射模式下,设备坐标以0.1 毫米为一个长度单位,Y轴的正方向为向上,也就是说,屏幕上的左上角的Y坐标为0,下面的Y坐标均小于0),当使用语句: MoveTo(100,-600); LineTo(100,-800);//Y轴负方向向下,所以用负值 进行画图时,它的转换过程如下: 1)窗口与视口坐标转换,由于窗口坐标(100,-300 ),映射为设备坐标(0,0),所 以 窗口(100,-600)映射为视口(0,-300) 窗口(100,-800)视映射为视口(0,-500)
2)逻辑与设备坐标转换 由于是 MM_LOMETRIC 映射模式,设备坐标的单位长度为 0.1mm,而在输出时用的是视口坐标,所以视口坐标(100,-600)输出到屏幕上时,该点的位置 距客户区左边 0 厘米,距客户区上边 3厘米。这就是直线的起点; 再把直线终点的视口坐标(100,-800)输出到距客户区左边0厘米,距客户区上边 5厘米处。 以上就是全部过程 在不同的映射模式下,一个逻辑单位 对应 不同的 设备单位, 例如:在 MM_TEXT 映射模式下,设备坐标是以像素为单位的, 也就是说,如果你这时要用一个函数画一条直线,并且传递给它的参数大小为
100,(通常情况下,传递给函数的参数通常是视作逻辑坐标下的数值,也就是说,这里的100指的是逻辑坐标里100个单位长度.不过也不一定,用时请看具体情况,这个我也不大清楚),那么它将会在屏幕上画一条100像素长的线条, 如果是在 MM_LOMETRIC 映射模式下,设备坐标是以0.1 毫米为一个长度单位的,如果你这时要用一个函数画一条直线,并且传递给它的参数大小为 100,那么它将会在屏幕上画出 0.1毫米 * 100 = 10 厘米 长的直线, 当然,由于各种复杂的原因,画长的直线可能并不是刚好10 厘米长,但误差不会很大
至于窗口与视口坐标的问题,你可以看这里 http://baike.baidu.com/view/1522985.htm 补充: 我的理解是这样的,窗口坐标与视口坐标是与DC(即设备上下文)相关的,如果 DC是整个屏幕,那么窗口坐标的原点就是屏幕的左上角,如果DC是一个应用程序的窗口的客户区,那么窗口坐标的原点就是该客户区的左上角
相关文章推荐
- 窗口坐标,逻辑坐标与视口坐标,设备坐标的区别
- 逻辑坐标(窗口) 设备坐标(视口)
- 逻辑坐标,设备坐标,窗口,视口
- windows GDI编程中关于窗口和视口,逻辑坐标和设备坐标的转换
- 设备坐标和逻辑坐标(窗口、视口)
- 逻辑坐标,设备坐标,窗口,视口
- 用图说话——windows中的视口、窗口、逻辑坐标、设备坐标
- windows 屏幕坐标 窗口坐标 客户区坐标 逻辑坐标 设备坐标之间的关系及转换
- 逻辑坐标和设备坐标的区别
- 关于逻辑坐标,设备坐标。分辨率变了之后,窗口如何布局
- 逻辑坐标与设备坐标——全窗口坐标、屏幕坐标、客户区坐标的总结
- 设备坐标(DP)、客户坐标(Client)、逻辑坐标(LP)在用法和含义上都有哪些区别呢?
- 设备坐标、逻辑坐标、物理坐标的区别与转换(更改原文一处错误)
- 设备坐标、逻辑坐标、物理坐标的区别与转换
- 屏幕坐标,窗口坐标,客户区坐标,逻辑坐标的区别
- 屏幕坐标、设备坐标以及逻辑坐标的区别
- 逻辑坐标和设备坐标的区别
- 逻辑坐标与设备坐标——全窗口坐标、屏幕坐标、客户区坐标的总结
- windows 屏幕坐标 窗口坐标 客户区坐标 逻辑坐标 设备坐标之间的关系及转换
- 滚动窗口绘制 鼠标点击坐标与绘制坐标 设备坐标和逻辑坐标