プログラミングメモ →目次


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);
    }
}