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个逻辑点(数学上的长度)。cxcy看起来好像是为了设定描画範囲参数,其实不然。很简单,它们是代表逻辑长度与物理长度的比值的分子和分母。正负符号也可以设定。当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);
    }
}