《setwindoworg setviewportorg setwindowext,setviewportext》由会员分享,可在线阅读,更多相关《setwindoworg setviewportorg setwindowext,setviewportext(4页珍藏版)》请在金锄头文库上搜索。
1、SetWindowOrgSetWindowOrg SetViewportOrgSetViewportOrg SetWindowExt,SetViewportExtSetWindowExt,SetViewportExt下面举例说明:(MM_TEXT 映射模式)SetWindowOrg,SetViewportOrg,SetWindowExt,SetViewportExt 按习惯,(0,0)就原点,原点就是(0,0),但是如果用此来理解windows 的 map mode,就会走弯路。其实,稍微改变一下观念,windows 的 map mode 就比较好理解了。举例说明:page space-dev
2、ice spacepDC-SetMapMode(MM_LOMETRIC);pDC-SetWindowOrg(40,0); /这句“设定”page space 的原点为(40,0),注意,/这时(40,0)就是原点,原点就是(40,0)这个点,其实,(0,0)与原点没有必然联系。这/一句对下面的画图函数在 page space 中所作的图不会有任何影响。一句话:SetWindowOrg /就是指定一下,page space 中哪个点为原点。pDC-Rectangle(0,0,100,-100);pDC-Rectangle(0,-100,50,-200);同理,SetViewportOrg 也是指
3、定一下,device space 中哪个点为原点,两个坐标系映射时,两个原点重合。SetWindowExt 设定 page space 的大小,SetViewportOrg 设定device space 的大小,其实,真正有意义的只是两者的比例关系,例如,在一个 1024*768 的显示屏上:pDC-SetMapMode(MM_ISOTROPIC);pDC-SetWindowExt(10240,7680);pDC-SetViewportExt(1024,768);pDC-Rectangle(0,0,100,100);就会画一个 10 pixels*10 pixels 的矩形。其本质就是,X 方
4、向,每个逻辑单位有 1024/10240 个象素,Y 方向每个逻辑单位有768/7680 个象素。因此,下面的代码有相同的作用:pDC-SetMapMode(MM_ISOTROPIC);pDC-SetWindowExt(102400,76800);pDC-SetViewportExt(10240,7680);pDC-Rectangle(0,0,100,100);两者本质一样,前者更易于理解 文章出处:http:/ Jeff Prosise 的那本“Programming Windows with MFC, 2 ed.“。尽管是英文版的,但是感觉这本书上手比喉结的那本所谓的 深入浅出 MFC 要
5、容易理解的多。候同学给人一种故弄玄虚故作深沉的感觉,而 Jeff Prosise 的这本书才真正的称得上是深入浅出。尽管如此,其中有关 GDI 绘图中的坐标映射部分还是有一个问题没有搞清楚,那就是 SetWindowOrg 和 SetViewportOrg 这两个函数到底应该如何理解。潘爱民翻译的那本 VC 内幕没有讲清楚;Jeff Prosise 的这本书没有讲清楚;MSDN 上的东西看的也是一头雾水;Charles Petzold 的那本书还没有来得及看。因为这个问题,昨天晚上是带着遗憾的困惑入睡的。总的来说,我对这两个函数的理解导致的结果是与实际程序运行的结果截然相反。依据 MSDN 上
6、的解释,有一个很严重的问题没有阐述清楚,那就是:所谓的 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);现在我的理解是:应该是 s
7、et 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. 当在逻辑坐标中指定新的原点后,在执行映射时
8、,设备坐标的原点一定要与逻辑坐标的新原点重合;反过来也是一样,即两个坐标系的原点一定要重合。文章出处:http:/ 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)需要与设备坐标
9、的原点(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)