基础上,文章详述了怎样建立不同原点、单位和正方向的逻辑坐标系,对坐标系的构建原理进行了深入剖析。关键词:GDI映射方式;视口;窗口;逻辑坐标系中图分类号:TP311文献标识码:A文章编号:1009-3044(2006)05-0168-02CoordinatesinWindowsGraphicsProgrammingandtheGDIMappingModeJIANGChun-yong(ComputingCenterofthePartyUniversityofHuaihuaCityCommitteeofCCP,Huaihua418008,China)Abstract:BeginningontheGDImappingmode,thepaperdiscussestheconcepts,meaningandrelationofviewportbasedonlogiccoordi-natesandwindowbasedondevicecoordinates.Basedonthis,thepaperexpandshowtosetallkindsoflogiccoordinateswithdifferentorigin,unitandorientation,thenanatomizestheprinciplesofthesecoordinates.0引言图形设备接口GDI是Windows的子系统,它负责在视频显示器和打印机上显示图形。从程序员的观点来看,GDI由几百个函数调用和一些相关的数据类型、宏和结构组成。大多数GDI绘图函数需要坐标值或大小。例如:TextOut(hdc,x,y,psText,iLength);参数x和y分别表示文字的开始位置。参数x是在水平轴上的位置,参数y是在垂直轴上的位置,通常用(x,y)来表示这个点。在TextOut中,以及在几乎所有GDI函数中,这些坐标值使用的都是一种“逻辑坐标”。Windows必须将逻辑坐标转换为“设备坐标”。逻辑坐标,晦涩的定义是内存中虚拟的坐标,我们可以理解为图形编程中使用的坐标值,如TextOut函数中的参数x和y,逻辑坐标系的原点、正方向和单位由程序员选定后,它们的含义确定。设备坐标,直接作用于具体的设备,如:显示器和打印机等,设备坐标系始终以像素为单位,水平轴上的值从左到右递增,垂直轴上的值从上到下递增,对于最常用的“客户区坐标系”,原点(0,0)是客户区的左上角。逻辑坐标,必须由windows转化为设备坐标后,才能为具体的设备显示所使用。这种转换由映射方式、窗口和视口的原点以及窗口和视口的范围所控制。1GDI映射方式GDI映射方式定义了Windows如何将GDI函数中指定的逻辑坐标映射为设备坐标,也即定义设定什么样的逻辑坐标系。2视口和窗口映射方式指定了逻辑坐标系的逻辑单位和坐标轴正方向,坐标原点没有涉及。而且,在“自作主张的”两种映射方式下,逻辑单位、坐标轴正方向和坐标原点都有待确定。“视口”是基于设备坐标的,通常,视口与客户区相同。点(0,0)是客户区域的左上角。x的值向右增加,y的值向下增加。“窗口”是基于逻辑坐标的,逻辑坐标可以是像素、毫米、英寸等,我们在GDI绘图函数中指定逻辑窗口坐标。映射方式实际上是用于定义从“窗口”(逻辑坐标)到“视口”(xWindow,yWindow)是待转换的逻辑点,(xViewport,yViewport)是转换后的设备坐标。视口原点(xViewOrg,yViewOrg)和窗口原点(xWinOrg,yWinOrg)默认情况下均为(0,0),可以改变;(xWinExt,yWinExt)是逻辑坐标的窗口范围;(xViewExt,yViewExt)是设备坐标的视口范围,只有在MM_ISOTROPIC和MM_ANISOTROPIC映射方式下范围可以改变。3深入坐标系与GDI映射方式3.1窗口原点和视口原点Windows提供了函数SetViewportOrgEx和SetWindowOrgEx,用来改变视口和窗口的原点,这些函数都具有改变轴的效果,使(0,0)不再是左上角。如果将视口原点改变为(xViewOrg,yViewOrg),则逻辑点(0.0)就会映射为设备点(xViewOrg-xWinOrg,yViewOrg-yWinOrg)。如果将窗口原点改变为(xWinOrg,yWinOrg),则逻辑点(xWinOrg-xViewOrg,yWinOrg-yViewOrg)将会映射为设备点(0,0)。例如,假设客户区为cxClient个像素宽和cyClient个像素高。在MM_TEXT映射方式下,客户区的逻辑坐标系如图1(1),如果想将逻辑点(0,0)定义为客户区中心,代码如下:收稿日期:2005-12-16作者简介:蒋春勇(1972-168电脑知识与技术),男,湖南省怀化人,计算机科学专业,研究方向:计算机网络与多媒体。点(xWinOrg,yWinOrg)为(0,0),逻辑点(0,0)将映射为设备点(cx-Client/2,cyClient/2),客户区的逻辑坐标系如图1(2)。窗口范围和视口范围的比例允许任意改变,如(2,2)/(1,-1),并将逻辑点(0,0)映射到客户区中心,如图3(2)所示。也可以选择(2*cxClient,cyClient)/(cxClient,-cyClient),使xWinExt/xViewExt和yWinExt/yViewExt的绝对值不...