C++博客 :: 首页 :: 新随笔 ::  ::  :: 管理

设置MFC坐标系

Posted on 2011-05-05 12:03 Kevin_Zhang 阅读(1721) 评论(0)  编辑 收藏 引用

注意一点:把设置代码放在画图类的前面。即可显示。一味的放在OnDraw()里有时候是没用的。

设置MFC坐标系,读懂以下函数:

CRect   rect; 
GetClientRect(&rect); 
pDC-> SetMapMode(MM_ANISOTROPIC); 
pDC-> SetWindowExt(100,-100); 
pDC-> SetViewportExt(100,100); 
pDC-> SetViewportOrg(rect.left,rect.bottom); 
CPoint   pointOrg(0,0); 
CPoint   pointEnd(100,100); 
pDC-> MoveTo(pointOrg); 
pDC-> LineTo(pointEnd); 
但是希望知道在Setwindowext和setviewportext函数中的参数是什么意思? 
发现把里面的100都改写成1000的话效果是一样的。。。 
已经知道了这两个函数可以起到放大缩小的类似效果了

首先,windows程序在画图时,window有一个设备描述表,比如画一个宽为20,高为10单位长度的矩形,注意这个单位长度是对于设备描述表来说的,默认情况下,一个设备描述表单位长度(即逻辑单位)对应一个像素大小,如果需要将逻辑单位与物理单位这个对应改变,就需要使用SetMapMode函数来设置新的映射模式了.比如SetMapMode(LOENGLISH)表示一个逻辑单位映射到视频窗口或者打印机等物理设备时,对于0.01英寸.而SetMapMode(ANIOSTROPIC)表示x,y轴单独缩放.这是既然要单独缩放,比如支持x,y轴的缩放比例.后面的SetWindowExt(a1,b1)和SetViewportExt(a2,b2)正是表示这个缩放比例的.这里表示,x轴缩放比例是a1逻辑长度缩放为物理长度a2,同理,b1缩放为b2.后面的SetViewportOrg(x,y)表示将物理设备的坐标原点移到(x,y)位置.比如显示器默认坐标原点是屏幕的左上角(0,0)位置,而现在移到(x,y)位置,这是平面坐标平移,这个不用详细说了.假设要话一个矩形(0,0,100,100),物理设备原点移到到(x,y)后,本来要在左上角话的矩形,此时实际话在(x,y,100x,100y)的位置上(这里假设显示器左上角为(0,0)坐标).实际上还有一个函数SetWindowOrg(x,y)这个是设置逻辑设备的原点.如果需要知道比较详细,请参考<<mfcwindow编程>>一书


建立以左上角为原点,X轴和Y轴为1000的坐标 
我们可以用以下代码:

void CTtView::OnDraw(CDC* pDC) 
{ 
CTtDoc* pDoc = GetDocument(); 
ASSERT_VALID(pDoc); 
CRect rect; 
GetClientRect(&rect);

pDC->SetMapMode(MM_ANISOTROPIC); 
pDC->SetViewportOrg(0,0); 
pDC->SetViewportExt(rect.right,rect.bottom);

pDC->SetWindowOrg(0,0); 
pDC->SetWindowExt(1000,1000);

pDC->MoveTo(50,50); 
pDC->LineTo(50,950); 
pDC->LineTo(950,950); 
pDC->LineTo(50,50); 
}

代码分析:

1. GetClientRect(&rect); 取得客户区矩形区域,将其存放在rect中

2. 用pDC->SetMapMode(MM_ANISOTROPIC); 设置映射模式

3. 通过pDC->SetViewportOrg(0,0);设置逻辑坐标的原点

4. 通过pDC->SetViewportExt(rect.right,rect.bottom);和

pDC->SetWindowExt(1000,1000);来确定逻辑坐标下和设备坐标下的尺寸对应关系

5. 在MM_ANISOTROPIC模式下,X轴单位和Y轴单位可以不相同

6. 坐标方向的确定方法是如果逻辑窗范围和视口范围符号相同,则逻辑坐标的方向和视口的方向相同,即X轴向右为正,Y轴向下为正。

7. 如果将显示模式改为MM_ISOTROPIC,那么X轴单位和Y轴单位一定相同,感兴趣的读者可以自己使一下。

(二) 建立以视窗中心为原点的坐标 
用如下代码:

void CTtView::OnDraw(CDC* pDC) 
{ 
CTtDoc* pDoc = GetDocument(); 
ASSERT_VALID(pDoc); 
CRect rect; 
GetClientRect(&rect);

pDC->SetMapMode(MM_ANISOTROPIC); 
pDC->SetViewportOrg(rect.right/2,rect.bottom/2); 
pDC->SetViewportExt(rect.right,rect.bottom);

pDC->SetWindowOrg(0,0); 
pDC->SetWindowExt(1000,-1000);

pDC->MoveTo(150,150); 
pDC->LineTo(-150,-200); 
pDC->LineTo(150,-150); 
pDC->LineTo(150,150); 
}

代码分析:

1. 用 pDC->SetViewportOrg(rect.right/2,rect.bottom/2); 设置视口的原点。

2. 用pDC->SetViewportExt(rect.right,rect.bottom);和pDC->SetWindowExt(1000,-1000);来确定设备坐标和逻辑坐标的单位对应关系。

3. 因为逻辑窗范围和视口范围的符号不一致,纵坐标取反,所以Y轴向上为正。


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