读书笔记-----------windows映射方式

来源:互联网 发布:阿里云华北2速度怎样 编辑:程序博客网 时间:2024/06/05 14:16

在几乎所有GDI函数中,这些坐标值使用的都是一种「逻辑单位」。Windows必须将逻辑单位转换为「设备单位」,即图素。这种转换是由映像方式、窗口和视端口的原点以及窗口和视端口的范围所控制的。映像方式还指示着x轴和y轴的方向(orientation);也就是说,它确定了当您在向显示器的左或者右移动时x的值是增大还是减小,以及在上下移动时y的值是增大还是减小。

Windows定义了8种映像方式:




Windows都用下面两个公式来将窗口(逻辑)坐标转化为视埠(设备)坐标:


其中,(xWindow,yWindow)是待转换的逻辑点,(xViewport,yViewport)是转换后的设备坐标点,一般情形下差不多就是显示区域坐标了。(xWinOrg,yWinOrg)是逻辑坐标的窗口原点;(xViewOrg,yViewOrg)是设备坐标的视端口原点。在内定的设备内容中,这两个点均被设定为(0,0),但是它们可以改变。:(xWinExt,yWinExt)是逻辑坐标的窗口范围;(xViewExt,yViewExt)是设备坐标的窗口范围。在多数映像方式中,范围是映像方式所隐含的,不能够改变。每个范围自身没有什么意义,但是视端口范围与窗口范围的比例是逻辑单位转换为设备单位的换算因子。


Windows也能将视埠(设备)坐标转换为窗口(逻辑)坐标:



处理MM_TEXT
对于MM_TEXT映像方式,内定的原点和范围如下所示:
窗口原点:(0, 0) 可以改变
视埠原点:(0, 0) 可以改变
窗口范围:(1, 1) 不可改变
视埠范围:(1, 1) 不可改变
视端口范围与窗口范围的比例为1,所以不用在逻辑坐标与设备坐标之间进行缩放。


此时设备坐标在左上角,逻辑坐标在左上角,坐标格式如下图:



改变设备原点和逻辑原点的例子:

例子1:

SetViewportOrgEx (hdc, cxClient / 2, cyClient / 2, NULL) ;

SetViewportOrgEx的参数总是使用设备单位。现在,逻辑点(0,0)将映像为设备点(cxClient/2,cyClient/2),而显示区域的坐标系变成如下形状:



此时设备原点在左上角,逻辑原点在中心,设备原点确定客户区的显示范围,即确定能被我们看到的区域在哪里,逻辑原点确定坐标系



例子2:

SetWindowOrgEx (hdc, -cxClient / 2, -cyClient / 2, NULL) ;

SetWindowOrgEx的参数总是使用逻辑单位。在这个呼叫之后,逻辑点(-cxClient / 2,-cyClient / 2)映像为设备点(0,0),即显示区域的左上角。而显示区域的坐标系变成如下形状:



此时区域的坐标改变如下图:




例子3:

SetViewportOrgEx (hdc, cxClient / 2, cyClient / 2, NULL) ;
SetWindowOrgEx (hdc, -cxClient / 2, -cyClient / 2, NULL) ;

这意味着逻辑点(-cxClient/2,-cyClient/2)将映像为设备点(cxClient/2, cyClient/2),结果是如下所示的坐标系:



此时的区域坐标改变如下:




对于MM_LOENGLISH,Windows计算的范围如下:


此时坐标系如下:



例子1:

SetViewportOrgEx (hdc, 0, cyClient, NULL) ;

此时坐标系如下:



此时的区域坐标改变如下:



例子2:

SetViewportOrgEx (hdc, cxClient / 2, cyClient / 2, NULL) ;

此时的坐标系如下所示:




MM_ISOTROPIC映像方式

如果想要在使用任意的轴时都保证两个轴上的逻辑单位相同,则MM_ISOTROPIC映像方式就是理想的映像方式。这时,具有相同逻辑宽度和高度的矩形显示为正方形,具有相同逻辑宽度和高度的椭圆显示为圆。当您刚开始将映像方式设定为MM_ISOTROPIC时,Windows使用与MM_LOMETRIC同样的窗口和视端口范围(但是,不要对此有所依赖)。区别在于,您现在可以呼叫SetWindowExtEx和SetViewportExtEx来根据自己的偏好改变范围了,然后,Windows将调整范围的值,以便两条轴上的逻辑单位有相同的实际距离

一般说来,您可以用所期望的逻辑窗口的逻辑尺寸作为SetWindowExtEx的参数,用显示区域的实际宽和高作为SetViewportExtEx的参数。Windows在调整这些范围时,必须让逻辑窗口适应实际窗口,这就有可能导致显示区域的一段落到了逻辑窗口的外面。必须在呼叫SetViewportExtEx之前呼叫SetWindowExtEx,以便最有效地使用显示区域中的空间。

例1:

SetMapMode (hdc, MM_ISOTROPIC) ;
SetWindowExtEx (hdc, 32767, 32767, NULL) ;
SetViewportExtEx (hdc, cxClient, -cyClient, NULL) ;
SetViewportOrgEx (hdc, 0, cyClient, NULL) ;

此时的坐标系如下:

如果其后用GetWindowExtEx和GetViewportExtEx函数获得了窗口和视端口的范围,可以发现,它们并不是先前指定的值。Windows将根据显示设备的纵横比来调整范围,以便两条轴上的逻辑单位表示相同的实际尺寸。
如果显示区域的宽度大于高度(以实际尺寸为准),Windows将调整x的范围,以便逻辑窗口比显示区域视端口窄。这样,逻辑窗口将放置在显示区域的左边。



此时的区域坐标改变如下:

SetMapMode (hdc, MM_ISOTROPIC) ;
SetWindowExtEx (hdc, 32767, 32767, NULL) ;
SetViewportExtEx (hdc, cxClient, -cyClient, NULL) ;

经过以上语句后,区域坐标如下:



SetMapMode (hdc, MM_ISOTROPIC) ;
SetWindowExtEx (hdc, 32767, 32767, NULL) ;
SetViewportExtEx (hdc, cxClient, -cyClient, NULL) ;
SetViewportOrgEx (hdc, 0, cyClient, NULL) ;

经过以上语句,区域坐标改变如下:




GDI:GDI含义是图形设备接口,主要任务是负责系统与绘图程序之间的信息交换,处理所有Windows程序的图形输出。GDI的出现使程序员无需要关心硬件设备及设备驱动,就可以将应用程序的输出转化为硬件设备上的输出,实现了程序开发者与硬件设备的隔离,大大方便了开发工作。

0 0
原创粉丝点击