📄 11.1.3 逻辑坐标和设备坐标.txt
字号:
11.1.3 逻辑坐标和设备坐标
几乎在所有 GDI函数中使用的坐标值都采用是的逻辑单位。 Windows必须将逻辑单位转换为"设备单
位气即像素。这种转换是由映射方式、窗口和视口的原点,以及窗口和视口的范围所控制的。例如
下面这条在窗口中输出文本的 TextOut语句:
dc->TextOut(O. 100. "text");
该函数的参数值 (0,100)采用的就是逻辑单位,当程序运行后,在窗口中真正显示文本时,该参数
值需要被转换为设备单位,而且转换的结果由映射方式、窗口和视口的原点,以及窗口和视口的范
围控制。
Windows对所有的消息(如WM SIZE、WM_MOUSEMOVE、WM_LBUTTONDOWN、 WM_LBUTTONUP),所有的非GDI
函数和一些GDI函数(例如GetDeviceCaps函数),永远使用设备坐标。
1.映射模式
Windows提供的映射模式如表11.1所示。默认映射模式为MM_TEXT.在此映射模式下,逻辑单位和设备
单位相同,这时将逻辑坐标值 (0,100)转换为设备坐标后,它的值仍是 (0,100)。映射模式的改
变可以通过SetMapMode函数来实现。
表11 .1 映射模式
映射模式 说明
MM_ANISOTROPIC 逻绕单位被转换为任意单位,其中轴可以被随意缩放。将映射模式设置为
MM_ANlSIOTROPIC 不会改变当前窗口或视口的设置,为了更改单位、方向和缩放,需要调用
SetWindowExt和 SetViewportExt函数
MM ISOTROPIC 逻辑单位被映射为具有等刻度轴的任意单位。 HP: x铀上的一个单位等于y轴上的一
个单位。 使用 SetWindowExtEx和 SetViewportExtEx函数指定所需的轴的单位和方向。 GDI会根据
需要进行调整,以确保x和y轴的单位大小保持一致
MM HIENGLlSH 一个逻辑单位被转换为0 ∞l英寸. x轴向右为正, y轴向上为正
MM lID叫ETRIC 一个逻辑单位被转换为0. 01毫米。 x轴向右为正, y轴向上为正
MM LOENGLlSH 一个逻辑单位被转换为0.01英寸。 x轴向右为正, y轴向上为正
MM LOMETRIC 一个逻辑单位被转换为0.1毫米. x轴向右为正, y轴向上为正
MM TEXT 一个逻辑单位被转换为 l个设备像素。 x轴向右为正, y轴向下为正
MM TWIPS 一个逻辑单位被转换为 1120磅 (因为 l磅=ln2英寸,所以一个twip是 1/1440英寸). x
轴向 右为正, y轴向上为正
2.逻辑坐标和设备坐标的相互转换
对于逻辑坐标和设备坐标之间的相互转换,可以利用以下相应公式来完成。窗口(逻辑)坐标转换为
视口(设备〉坐标的两个公式:
xViewport=(xWindow-xWinOrg)* xViewExt/xWinExt +xViewOrg
yViewport= (yWindow-yWinOrg)* yViewExt/yWinExt +yViewOrg
视口(设备〉坐标转换为窗口 (逻辑〉坐标的两个公式:
xWindow=(xViewPort-xViewOrg)* xWinExt/xViewExt +xWinOrg
yWindow=(yViewPort-yViewOrg)食 yWinExt/yViewExt +yWinOrg
在岛岱1 TEXT映射方式下逻辑坐标和设备坐标的相互转换因为在MM TEXT映射方式下,逻辑单位和设
备单位是一样的,而且它们的窗口和视
.
.
第 11
口的范围都是 l x l的,相当于它们的转换因子就是1.因此窗口(逻辑)坐标转换为视口(设备)坐标
的两个公式为 :
xViewport = xWindow-xWinOrg+xViewOrg
yViewport = yWindow-yWinOrg+yViewOrg .
视口(设备)坐标转换为窗口(逻辑)坐标的两个公式为 :
xWindow = xViewport-xViewOrg+xWinOrg
yWindow = yViewport-yViewOrg+yWinOrg
而通过消息,例如鼠标左键单击消息得到的坐标点是以设备坐标为单位,即以像素为单位的值。因
为默认映射模式是 MM_TEXT,所以逻辑单位和设备单位是一样的,因此,在前面章节的程序中我们
没有显式地进行坐标点的转换,而是直接使用得到的设备坐标调用 GDI函数进行了图形的绘制。
3.视口和窗口原点的改变
CDC中提供了两个成员函数 : SetViewportOrg和 SetWindowOrg,用来改变视口和窗口的原点。如果
将视口原点设置为 (xViewOrg,y ViewOrg) ,则逻辑点 ( 0, 0)就会被映射为设备点( x ViewOrg,y
ViewOrg )。如果将窗口原点改变为 ( x WinOrg,yWinOrg ) ,则逻辑点 (xWinOrg,yWinOrg)将会被
映射为设备点 (0, 0),即设备客户区的左上角。注意=不管对窗口和视口原点如何改变,设备点 ( 0,
0 )始终是客户区的左上角。
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -