Go homepage(回首页) Upload pictures (上传图片) Write articles (发文字帖)
The author:(作者)aaapublished in(发表于) 2014/7/19 0:10:47 delphi坐标映射
坐标映射为什么在调用GDI 程序时不能使用设备坐标系代替逻辑坐标系呢?请首先运行下面代码:Form1.Canvas.TextOut(0,0,’UpperLaftCornerofForm’);上面的代码把字符串显示在窗体的左上角。逻辑坐标系的(0,0)位置对应于窗体设备环境的(0,0)位置。但是,窗体的左上角(0,0)不同于设备坐标系的(0,0)。如果窗体是在屏幕的左上角出现,窗体坐标系的(0,0)可以实际对应设备坐标系的(0,0)。将窗体移动到另一个坐标系时,窗体坐标系的(0,0)将对应设备上完全不同的位置。提示:通过Win32 API 函数ClientToScreen()和ScreenToClient(),可以把一个基于逻辑坐标系的坐标转换为基于设备坐标系的坐标。当然,也可以用TControl 的方法。注意,这只对屏幕的设备环境和可视的控件有效。对于打印机或图元文件的设备环境来说,由于不是以屏幕为参照,要把逻辑像素转换为设备像素,可以调用Win32 函数LptoDP()。还可以参看Win32 在线帮助中的DptoLP()函数。在调用Canvas.TextOut()时,Win32 实际上使用的是设备坐标系。为了让Win32 实现这一点,必须把逻辑坐标系映射成设备坐标系。通过设备环境的映射模式可以实现这一点。使用逻辑坐标系的另一个原因是为了适应不能在调用画图程序时使用像素,而是只能使用英寸或毫米的情况。正如看到的那样,Win32 通过改变映射模式来改变度量单位。映射模式有两个属性:一是Win32 把逻辑单位转换为设备单位的转换器,二是设备环境的x、y轴方向。提醒读者注意的是,在Delphi 7 中,与设备环境有关的绘画程序、映射模式、方向等看起来好像都是些不太重要的知识点,只是使用TCanvas 对象来绘画。实际上,TCanvas 只是对设备环境的封装。当Win32 GDI 程序与对应的Canvas 程序比较时,就看得明显了。例如,Canvas 程序:Canvas.Rectangle(0,0,50,50);GDI 程序:Rectangle(ADC,0,0,50,50);当使用GDI 程序时,要传递设备环境给程序,而Canvas 程序则使用封装的设备环境。Win32 给设备环境或TCanvas.Handle 定义了映射模式。实际上,Win32 定义了8 种可用的映射模式。·MM_ANISOTROPIC arbitrary(x<>y)or(x=y) 可定义/可定义·MM_HIENGLISH 0.001inch 右/上·MM_HIMETRIC 0.01mm 右/上·MM_ISOTROPIC arbitrary(x=y) 可定义/可定义·MM_LOENGLISH 0.01inch 右/上·MM_LOMETRIC 0.1mm 右/上·MM_TEXT1 pixel 右/下·MM_TWIPS 1/440inch 右/上Win32 定义了一些函数用于改变或者获取给定设备环境的映射模式。下面列出了这些函数。• SetMapMode()为给定设备环境设置映射模式。• GetMapMode()获取给定设备环境的映射模式。• SetWindowOrgEx()设置给定设备环境的窗口原点(0,0)。
赞