首页  编辑  

坐标定义

Tags: /超级猛料/Picture.图形图像编程/控件和绘图/   Date Created:

请问如何将屏幕左上角的坐标原点重新定义为左下角?

SetMapMode(g.Handle,MM_ISOTROPIC);

这一句是设定Win32映射模式,只有ISOTROPIC和ANISOTROPIC可以改变坐标方向

 SetWindowExtEx(g.Handle,1,1,nil);

 SetViewPortExtEx(g.Handle,1,1,nil);

这两句一方面设定逻辑单位与设备单位的比例,另一方面改变坐标方向

 SetViewPortOrgEx(g.handle,0,ClientWidth,nil);

这一句就是设定原点,这里的原点坐标是修改映射模式之前原点所在的坐标,

左下角在原来坐标系中就是0,ClientWidth.

这里的g就是窗口的TCanvas。

用上面四句就可以改变原点和坐标

SetMapMode 用于设置HDC的映射方式 Windows系统为用户提供了8种选择

MM_TEXT 按象素点映射, 这是系统缺省的映射方式, 即逻辑单位与物理单位

相同, 直接来说就是屏幕上的象素数

MM_LOMETRIC 以0.1mm为逻辑单位

MM_HIMETRIC 以0.01mm为逻辑单位

MM_LOENGLISH 以0.01英寸为逻辑单位 MM_HIENGLISH 以0.001英寸为

逻辑单位

MM_TWIPS TWIPS是一个Windows特有的计量单位, 指二十分之一点的尺寸,

出于种种 历史原因当时认定每个点的尺寸约为1/72英寸(我想可能与当时显示

其的 分辨率和可视面积等有关)所以每个TWIPS约合1/1440(1/72 * 1/20)英寸

MM_ISOTROPIC 可以由用户任意指定逻辑单位的尺寸和坐标原点, X和Y轴

的逻辑单位相同 若用户指定的不同Windows自己会对其进行调整

MM_ANISOTROPIC 可以由用户任意指定逻辑单位的尺寸和坐标原点, X和

Y轴的逻辑单位可以 不同, 就是说用户可以随意设定X,Y轴的尺寸

有一点需要注意的是, Windows中坐标的单位采用的是有符号的整数, 所以坐标值的

范围在 32767至-32768之间, 当然这是Windows3.1中的说法, Win32中的具体要求就不

大清楚了, 不过从Delphi3中的调用参数采用Integer类型来看, 应该说此项限制可能已

被取消, Delphi32 中的Integer类型已经是32bits等同于Longint。不幸的是Windows95中

好象还存在这个限制。

SetWindowExtEx 用于设定Windows X,Y坐标的范围, 就是坐标系的范围

SetViewportExtEx 用于设定ViewPort X,Y坐标的范围, 对于上述的SetMapMode函数中

的后两种情况逻辑单位的尺寸通过与SetWindowExtEx计算获得

SetViewportOrgExt 用于设定ViewPort 的原点

明白了这三个函数的意义, 相信构造一个笛卡耳坐标系可以说是非常容易的事情,

基本的步骤是先设定MapMode, 然后确定坐标系的范围, 最后就是设定原点的位置

了, 对于SetMapMode中系统提供的几种mode初始时原点的位置和Y轴的方向有所

不同, 最好 在设定时按照上述的步骤来进行, 当然除后两种Map Mode外

SetViewportExtEx没有什麽意义 一旦设定这些后, GDI函数就采用这些设定进行输出,

这个方法同样可用于对打印机的输出 我本人使用的感觉最大的作用在此。

临时做了一个小Demo用来演示几种Map Mode之间的不同, 可以参考一下mapmodedemo.zip

对了, 你提到在OnPaint Event中的处理方法和标准的WM_Paint message有些不同,

是由于VCL对message的封装造成的, 采用BeginPaint&EndPaint可能看不到显示的输出

其实是被VCL中的处理给覆盖掉了, 可以直接采用Form的Canvas property 作显示

Canvas的 handle Property 即是 HDC, 详细情况请参看范例。