关于MFC视口与窗口原点的设置

      最近在做一个类似Coreldraw的绘图软件,MFC的坐标机制确实有点烦人,首先,在设视口与窗口原点之前,我们必须设置好MFC的坐标映射模式,用SetMapMode()函数。

(1)视口原点的位置(就是画笔dc的初始位置)仅仅由SetViewportOrgEx (x,y) 函数
来移动。(x,y)是相对于客户区左上角的设备坐标,即像素),而SetWindowOrg
(X,Y )设置窗口的逻辑坐标点(X,Y)映射为的设备环境的设备点(0,0)(单位为逻辑坐标单位)

(2)其实既然叫做“映射模式”,我们就应该从“映射”这个角度来理解。
SetViewportOrg(x,y)就是把设备(视口)点(x,y)映射到逻辑点(0,0),所有坐标点都不用移动;
SetWindowOrg(x,y)就是把逻辑(窗口)点(x,y)映射到设备点(0,0),同样所有坐标点都不用移动;
只要(0,0)确定了,其他的点跟着变就行了。

 

比如在MM_LOMETRIC模式下,逻辑坐标,x轴向右,y轴向上,用代码:

CRect rect;

GetClientRect(&rect);

pDC->SetViewportOrg(rect.width()/2, rect.heigth()/2);

就是把设备坐标的(rect.width()/2, rect.heigth()/2)位置映射到了逻辑坐标的(0,0)点,或者说,逻辑坐标的(rect.width()/2(单位转换), rect.heigth()/2(单位转换))点,就是设备坐标的(0,0)点。

用代码:

CRect rect;

GetClientRect(&rect);

pDC->SetWindowOrg(-rect.width()/2(单位转换), rect.heigth()/2(单位转换));

就是把逻辑坐标的(-rect.width()/2(单位转换), rect.heigth()/2(单位转换))映射到了设备坐标的(0,0)点。

 

上面两种方法都把逻辑坐标映射到了屏幕中心。

 

 

posted on 2015-08-10 22:04  愤怒的螃蟹  阅读(1111)  评论(0编辑  收藏  举报