最近在做一个类似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)点。
上面两种方法都把逻辑坐标映射到了屏幕中心。