您的位置:首页 > 其它

关于SetWindowOrgEx、SetViewportOrgEx、SetViewportExtEx 和SetWindowExtEx 详解

2015-05-05 22:15 435 查看
关于SetWindowOrgEx、SetViewportOrgEx、SetViewportExtEx 和SetWindowExtEx 详解

规律:

1. SetWindowOrgEx、SetViewportOrgEx的作用是 实现原点映射。

2. SetViewportExtEx 和SetWindowExtEx 的作用是 实现比例映射。

3.设备坐标系的原点(0,0)始终在左上角,这个是不变的。设备坐标值(0,0)就在 那里,不管你怎么折腾。

4.函数SetWindowOrgEx 指明了哪个逻辑坐标值和设备坐标值(0,0)映射。

MSDN:The SetWindowOrgEx function specifies which window point maps to the viewport origin (0,0).
SetWindowOrgEx(hdc,Logx,Logy,NULL) 实现了
逻辑坐标(Logx,Logy) ←------------------→ 设备坐标(0,0)

5 函数SetViewPortOrgEx 指明了哪个设备坐标值和逻辑坐标值(0,0)映射。

MSDN:The SetViewportOrgEx function specifies which device point maps to the window origin (0,0).
SetViewPortOrgEx (hdc,Devx,Devy,NULL) 实现了
逻辑坐标(0,0) ←------------------→ 设备坐标(Devx,Devy)

6 SetViewportExtEx 和SetWindowExtEx 是设置映射比例的。
A:只有在MM_ISOTROPIC和MM_ANISOTROPIC模式下才有作用。

B:下面几种模式已经有默认的映射比例,2个函数是无效的。

When the following mapping modes are set, calls to the
SetWindowExtEx and SetViewportExtEx functions are ignored.

MM_HIENGLISH MM_HIMETRIC MM_LOENGLISH MM_LOMETRIC MM_TEXT MM_TWIPS

C: 当模式为MM_ISOTROPIC 的时候,程序必须在调用SetViewportExtEx之前 调用 函数SetWindowExtEx
When MM_ISOTROPIC mode is set, an application must call the
SetWindowExtEx function before it calls SetViewportExtEx

1、 SetWindowOrgEx 是设置窗口(逻辑坐标系)的原点坐标。

例如:

Ellipse(hdc,-100,-100,100,100);

MoveToEx(hdc,-200,0,NULL);

LineTo(hdc,200,0);

MoveToEx(hdc,0,-200,NULL);

LineTo(hdc,0,200);

MoveToEx(hdc,0,0,NULL);

LineTo(hdc,100,100);

运行程序的效果为:



修一下程序为:

SetWindowOrgEx(hdc,-100,-100,NULL);

Ellipse(hdc,-100,-100,100,100);

MoveToEx(hdc,-200,0,NULL);

LineTo(hdc,200,0);

MoveToEx(hdc,0,-200,NULL);

LineTo(hdc,0,200);

MoveToEx(hdc,0,0,NULL);

LineTo(hdc,100,100);

运行效果为:



得出结论:SetWindowOrgEx是设置窗口原点坐标的大小

2、 SetViewportOrgEx设置视口原点坐标。

我们将上面程序再次修改一下:

SetViewportOrgEx (hdc,100,100,NULL);

Ellipse(hdc,-100,-100,100,100);

MoveToEx(hdc,-200,0,NULL);

LineTo(hdc,200,0);

MoveToEx(hdc,0,-200,NULL);

LineTo(hdc,0,200);

MoveToEx(hdc,0,0,NULL);

LineTo(hdc,100,100);

效果很上面的一样:



得出结论:SetViewPortOrgEx是设视口原点坐标的大小,也就是客户区的原点大小。在默认的情况下,客户区的原点为左上角坐标为(0,0)。调用SetViewportOrgEx (hdc,100,100,NULL)就把客户的原点坐标设置为(100,100),那么原来客户区的左上角的坐标就变为了(-100,-100)(在映射模式为MM_TEXT时)。

3、 SetWindowExtEx, 用于设置逻辑坐标范围。

SetViewPortExtEx, 用于设置设备坐标范围。

注意:

1、上面的两个函数的调用,只有在映射模式为MM_ANISOTROPIC 和MM_ISOROPIC下才有作用,在其他的模式下将被忽略。

2、必须在调用SetViewPortExtEx之前调用SetWindowExtEx,以便最有效地使用显示区域中的空间。

修改上面的代码:

SetMapMode(hdc,MM_ANISOTROPIC);

SetWindowExtEx(hdc,200,200,NULL);//将窗口的逻辑坐标X轴0 到200,Y轴设置为0 到200

//将视口原点设置为客户区的中心点上

SetViewportOrgEx(hdc,rectClient.right / 2,rectClient.bottom / 2,NULL);

//将窗口的设备坐标X轴 0 到 rectClient.right,Y轴0 到 rectClient.bottom

SetViewportExtEx(hdc,rectClient.right,rectClient.bottom,NULL);

Ellipse(hdc,-100,-100,100,100);

MoveToEx(hdc,-200,0,NULL);

LineTo(hdc,200,0);

MoveToEx(hdc,0,-200,NULL);

LineTo(hdc,0,200);

MoveToEx(hdc,0,0,NULL);

LineTo(hdc,100,100);

效果图为:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: