【笨嘴拙舌WINDOWS】GDI映射方式

时间:2022-01-04 15:07:26

TextOut(hdc,100,100,TEXT(“Love China”),10)

这句GDI函数的作用是在坐标点(100,100)的位置输出一个“Love China”字符串:

【笨嘴拙舌WINDOWS】GDI映射方式

GDI函数作为硬件设备(显示器,打印机)的接口封装中间层,其传入的参数坐标值(100,100)要在设备上哪个位置显示,是通过GDI映射方式定义的!也就是说:

(100,100) ----------------通过方式A映射之后,可以变成----------------》(1,1)

(100,100) ----------------通过方式B映射之后,可以变成----------------》(10,1)

(100,100) ----------------通过方式C映射之后,可以变成----------------》(1,3)

(100,100) ----------------通过方式C映射之后,可以变成----------------》(5,1)

左边这一列的坐标(100,100)就是一个逻辑坐标(所有GDI函数都是)

右边这一列的坐标(1,1)就是一个设备坐标

所谓映射,就是将一个值通过一个数学公式变成另外一个值

以下是WINDOWS定义的各种映射模式

“在默认情况下,WINDOWS的坐标原点在(0,0)点,但是可以通过调用SetWindowOrgEx来改变逻辑坐标点的原点,通过SetViewportOrgEx来改变设备坐标的原点;如果传入的参数有负号,还能够改变对应轴的正方向;X轴的正方向指向屏幕的右侧,不同的映射模式Y轴正方向不一样”

MM_TEXT                      一个逻辑单位映射成一个像素      Y:指向屏幕下侧

MM_LOMETRIC             一个逻辑单位映射成0.1mm        Y:(以下都指向上侧)

MM_HIMETRIC              一个逻辑单位映射成0.01mm

MM_LOENGHLISH         一个逻辑单位映射成0.01英寸

MM_HIENGLISH            一个逻辑单位映射成0.001英寸

MM_TWIPS                   一个逻辑单位映射成1/1440英寸

MM_ISOTROPIC             一个逻辑单位映射成自定义的设备单位

MM_ANISOTROPIC        一个逻辑单位映射成自定义的设备单位

“黑色背景的映射方式能改变逻辑坐标(也叫窗口)或者设备坐标(也叫视口)的范围

不同之处:

MM_ISOTROPIC在设置范围时WINDOWS将自动调整使得,逻辑坐标的X与设备坐标的X之比=逻辑坐标的Y与设备坐标的Y之比

MM_ANISOTROPIC 不会调整”

【笨嘴拙舌WINDOWS】GDI映射方式

要在距离窗口左边距100像素,上边距100像素的位置写出一个I love you, China可以使用如下提供的各种

Setmapmode(dc,MM_TEXT);
SetViewportorgEx(dc,100,100,nil);
逻辑坐标(0,0)对应设备坐标(100,100)

textout(dc,0,0,'I love you, China',17);

【笨嘴拙舌WINDOWS】GDI映射方式

Setmapmode(dc,MM_TEXT);
SetWindowOrgEx(dc,100,100,nil);

逻辑坐标(100,100)对应设备坐标(0,0)
textout(dc,200,200,'I love you, China',17);

Setmapmode(dc,MM_LOMETRIC);
textout(dc,356,-356,'I love you, China',17);

Setmapmode(dc,MM_HIMETRIC);
textout(dc,3560,-3560,'I love you, China',17);

Setmapmode(dc,MM_LOENGLISH);
textout(dc,140,-140,'I love you, China',17);

Setmapmode(dc,MM_ISOTROPIC);
SetwindowExtEx(dc,getclientRect.Right,getclientrect.Bottom,nil);
SetViewportExtEx(dc,getclientRect.Right,-getclientrect.Bottom,nil);
textout(dc,100,100,'I love you, China',17);

Setmapmode(dc,MM_ANISOTROPIC);
SetwindowExtEx(dc,getclientRect.Right,getclientrect.Bottom,nil);
SetViewportExtEx(dc,getclientRect.Right,getclientrect.Bottom,nil);
textout(dc,100,100,'I love you, China',17);