SetViewportOrg与SetWindowOrg的理解

总的来说,我对这两个函数的理解导致的结果是与实际程序运行的结果截然相反。依据MSDN上的解释,有一个很严重的问题没有阐述清楚,那就是:所谓的SetWindowOrg(x, y)函数,到底是表示set window origin to (x, y)还是set window origin as (x, y);to和as在执行的时候,其操作的效果是截然相反的。
set window origin to (x, y)表示将坐标原点设置到(x, y);即以(x, y)作为坐标原点,此时原点坐标不再为(0, 0);
set window origin as (x, y)表示将原来的原点(0, 0)的坐标改为(x, y);即将所有点的坐标增加(+x, +y);
现在我的理解是:应该是 set window origin to (x, y)。这种理解基于以下几个前提:
1. 所有绘图语句中给出的坐标,全部是逻辑坐标,即在 window 中的坐标(相对于viewport所表示的设备坐标而言);
2. 所有用户能看到的点,其设备坐标一定是位于(0, 0)和(1024, 768)范围内;(假设显示器为输出设备,采用MM_TEXT映射方式,且屏幕分辨率为1024*768);
3. 所谓“(0,0)就原点,原点的坐标一定就是(0,0)”这种理解,是错误的;
4. Viewport中的坐标表示设备坐标;Window中的坐标表示逻辑坐标;
5. 当在逻辑坐标中指定新的原点后,在执行映射时,设备坐标的原点一定要与逻辑坐标的新原点重合;反过来也是一样,即两个坐标系的原点一定要重合。
下面举例说明:(MM_TEXT映射模式)
(1)
CRect rect(0, 0, 200, 200);
dc.rectangle(rect);
上面的语句在屏幕的最左上角绘制一个正方形;(因为此时逻辑坐标与设备坐标没有偏移)
(2)
dc.SetViewportOrg(100, 100);
CRect rect(0, 0, 200, 200);
dc.rectangle(rect);
将设备坐标的原点设置到(100, 100);即设备坐标的原点不在(0, 0)处,而是在(100, 100)处;此时若执行映射的话,逻辑坐标的原点(0, 0)需要与设备坐标的原点(100, 100)重合(参考前提5);那么此时绘制的矩形(0, 0, 200, 200)的坐标(为逻辑坐标,参考前提1)在设备坐标中就会映射为(100, 100, 300, 300),最终我们在显示器上看到的会是一个向右下方偏移(100, 100)的一个边长为200的正方形(用户看到的点是在设备坐标中的,参考前提2)
(3)
dc.SetWindowOrg(100, 100);
CRect rect(0, 0, 200, 200);
dc.rectangle(rect);
将逻辑坐标的原点设置到(100, 100);即逻辑坐标的原点不在(0, 0)处,而是在(100, 100)处;此时若执行映射的话,设备坐标的原点(0, 0)需要与逻辑坐标的原点(100, 100)重合(参考前提5);那么此时绘制的矩形(0, 0, 200, 200)的坐标(为逻辑坐标,参考前提1)在设备坐标中就会映射为(-100, -100, 100, 100),最终我们在显示器上看到的会是一个只有1/4个大小的矩形的一部分(事实上相当于向左上方偏移(100, 100)的一个边长为200的正方形。注意:用户看到的点是在设备坐标中的,参考前提2)

posted on 2008-03-12 12:39 弱水一瓢 阅读(451) 评论(0)  编辑 收藏 引用 所属分类: MFC


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


<2024年11月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
1234567

导航

统计

文章分类

最新评论