现在的位置: 首页 > 综合 > 正文

彻底理解窗口,视口,以及SDI各种映射模式

2018年06月06日 ⁄ 综合 ⁄ 共 1569字 ⁄ 字号 评论关闭

最近在学习《windows程序设计》,在数字时钟那里卡住了,就是这个SDI的映射模式,让我纠结了半个多月!!!看了网上的各种博客,帖子,发现都是各种复制粘贴,看得云里雾里的,经过自己的各种调试,终于理解了!或许,我理解的也不是十分透彻,也许有不足设置错误,希望大家批评指正!本人文笔十分差劲,还请大家多多包涵!

1.首先,不要被SetWindowOrgEx ,SetViewPortOrgEx,这两个函数所误解 ,从字面上看,好像是设置坐标原点,其实不然,这两个函数设置的是一种映射关系,设置的是两个基准点,也就是窗口基准点映射到视口基准点。

2.关于坐标系,以及坐标原点,设备坐标系的x轴永远指向右,y永远指向下,坐标原点永远(0,0),无论你怎样设置,这三要素永远不变!逻辑坐标系,默认x指向右,y指向下,

坐标原点(0,0),其中坐标原点(0,0)永远不变,不管你什么模式,而坐标系的方向虽映射模式变化,MM_TEX模式下,逻辑坐标x,y轴方向以及原点不可改变,MM_ISOTROPIC模式下,由SetWindowExtEx(hdc, wx,wy, NULL) ,SetViewportExtEx(hdc, vx, vy NULL)两个函数决定,若vx/wx为负数,则逻辑x轴向左,若vy/wy 为负数,则逻辑y轴向上,若皆为负数,则逻辑x想做,逻辑y向上。

3.关于SetWindowExtEx(hdc, wx,wy, NULL) ,SetViewportExtEx(hdc, vx, vy NULL)两个函数,他们决定了一种比例关系,若vx/wx=2则一个逻辑单位代表两个像素,若vx/wx=-2则一个逻辑单位代表两个像素,而且x轴反向。

如图所示:

举个例子,在MM_TEXT模式下,SetWindowExtEx(hdc, 200,200, NULL) 

等效如下图所示:

在MM_TEXT模式下,SetViewPortExtEx(hdc, 200,200, NULL) 

等效如下图:

《windows程序设计》,p150,有这么一段话,不推荐将这个两个函数放在一起使用(除非你知道这么做的结果)

SetWindowOrgEx (hdc,- cxClient/2,- cyClient/2, NULL) ;

SetViewporOrgEx (hdc, cxClient/2, cyClient/2, NULL) ;

效果如下图:

(MM_TEXT模式)

等效如下图

这其实和书上的图是一致的,-x轴,-y轴,原点右下角!

关于数字时钟程序:

注意 

SetWindowOrgEx (hdc, 138, 36, NULL) ;
SetViewportOrgEx (hdc, cxClient / 2, cyClient / 2, NULL) ;

执行后,WindowOrg是(138,36),而ViewPortOrg是什么就不一定了。

示意图如下,

也可能是这一种情况,具体取决于你窗口的大小

欢迎批评指正!

ps:

这个数字时钟程序,作者写得十分巧妙,应用了七段数码管的发光原理,看来我离高手还是有很大差距的呀!任重而道远啊!

我把第二个数组改了一下,有兴趣的朋友可以运行一下,看看我的和作者的在显示上有何不同之处。

 static POINT ptSegment [7][6] = {
 6,6,10,2,30,2,34,6,30,10,10,10,
 6,6,2,10,2,30,6,34,10,30,10,10,
 34,6,30,10,30,30,34,34,38,30,38,10,
 6,34,10,30,30,30,34,34,30,38,10,38,
 6,34,10,38,10,58,6,62,2,58,2,38,
 34,34,38,38,38,58,34,62,30,58,30,38,
 6,62,10,58,30,58,34,62,30,66,10,66

抱歉!评论已关闭.