|
SOFTIST
编程方法筆記 →目录
SetWindowExt与SetViewportExt(VC++) 调用SetMapMode(MM_ANISOTROPIC)时,逻辑描画領域坐标系的原点与画面的左上角是重叠的。然后需要调用SetWindowExt()函数和SetViewportExt()函数,来设定纵轴横轴的単位和方向以及伸缩比例。
virtual CSize SetWindowExt(int cxWindow, int cyWindow);
virtual CSize SetViewportExt(int cxViewport, int cyViewport);
一般说SetWindowExt()函数和SetViewportExt()函数要成对调用。它们的意思(功能)是:用cxViewport个物理像素来表现cxWindow个逻辑点(数学上的长度)。同样用cyViewport个物理像素来表现cyWindow个逻辑点(数学上的长度)。cx和cy看起来好像是为了设定描画範囲参数,其实不然。很简单,它们是代表逻辑长度与物理长度的比值的分子和分母。正负符号也可以设定。当cxViewport/cxWindow为正的情况下,X軸的方向是指向右方,反过来指向左方。
cyViewport/cyWindow为正的情况下,Y軸的方向是指向上方,反过来指向下方。
例:用全部用户区描画一个+-110的直角坐标系。void CVwporttestView::OnDraw(CDC* pDC)
{
CRect rect;
GetClientRect (&rect);
pDC->SetMapMode(MM_ANISOTROPIC);
pDC->SetWindowExt(220, -220);
pDC->SetViewportExt(rect.Width(), rect.Height());
pDC->SetViewportOrg(rect.Width() / 2, rect.Height() / 2);
pDC->MoveTo(-110, 0); pDC->LineTo(110, 0);
pDC->MoveTo(0, -110); pDC->LineTo(0, 110);
for (int i = -100; i <= 100; i += 10)
{
pDC->MoveTo(i, 2); pDC->LineTo(i, -2);
pDC->MoveTo(2, i); pDC->LineTo(-2, i);
CString strText;
strText.Format("%+d", i);
pDC->TextOut(i, -2, strText);
pDC->TextOut(5, i+4, strText);
}
} |