视图的缩放的完整论述,视图的缩放的完整论述
【 tulaoshi.com - C语言心得技巧 】
下载演示映射模式
下载视图放大/缩小演示程序
xViewport = (xWindow - xWinOrg)*xViewExt/xWinExt + xViewOrgyViewport = (yWindow - yWinOrg)*yViewExt/yWinExt + yViewOrg(xWindow,yWindow)是待转换的逻辑点,(xViewport,yViewport)是转换后的设备坐标。设备坐标的视口原点(xViewOrg,yViewOrg)和逻辑坐标的窗口原点(xWinOrg,yWinOrg)默认情况下均被设置成(0,0),但具体情况下可以改变;(xWinExt,yWinExt)是逻辑坐标的窗口范围;(xViewExt,yViewExt)是设备坐标的窗口范围,在多数映射方式下,范围是映射方式所隐含的,不能改变。注意:每个范围自身没有什么意义,但是视口范围和窗口范围的比是逻辑单位转换为设备单位的换算因子。例如,对于MM_LOENGLISH模式,xViewExt/xWinExt 表示每0.01英寸(一个逻辑单位)中水平像素数。 二 映射模式及视图缩放
Void CMyView::OnPrepareDC(){CView::OnPrepareDC(pDC,pInfo);CDC* pDC;pDC->SetMapMode(MM_ANISOTROPIC);int xLogPixPerInch = pDC->GetDeviceCaps(LOGPIXELSX);int yLogPixPerInch = pDC->GetDeviceCaps(LOGPIXELSY);pDC->SetWindowExt(100,100);pDC->SetViewportExt(xLogPixPerInch, yLogPixPerInch);}我们说过视口的幅度通常是屏幕客户区域的大小,而在上面的代码里我们并没有这样做。这样做可以吗?其实,在MM_TEXT的映射模式下,缺省的窗口范围和视口范围均为(1,1),从中可见,我们要设置的只是xViewExt/xWinExt的比值来决定显示比例的大小,而与xViewExt(视口范围)和xWinExt(窗口范围)的关系不大。GetDeviceCaps(LOGPIXELSX)和GetDeviceCaps(LOGPIXELSY)代表每逻辑英寸对应的水平像素点数;xLogPicPerInch/100代表每0.01逻辑单位对应的水平像素数目;那么100是什么意思呢?这就对应着每逻辑英寸对应的逻辑单位数目,也就是每逻辑单位对应于0.01逻辑英寸,有人会问,这不正是MM_LOENGLISH 方式吗?那么我们作做这样一个测试(见Demo),在OnDraw()中分别设置两种映射模式,看看到底有什么不同。
void CTestView::OnDraw(CDC* pDC){CTestDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);pDC->SetMapMode(MM_ANISOTROPIC);int xLogPixPerInch = pDC->GetDeviceCaps(LOGPIXELSX);int yLogPixPerInch = pDC->Ge
来源:http://www.tulaoshi.com/n/20160129/1483502.html