1

適例:

void CMainWindow::OnPaint ()
{
    CRect rect;
    GetClientRect (&rect);

    CPaintDC dc (this);
    dc.SetViewportOrg (rect.Width () / 2, rect.Height () / 2);
    dc.SetBkMode (TRANSPARENT);

    for (int i=0; i<3600; i+=150) {
        LOGFONT lf;
        ::ZeroMemory (&lf, sizeof (lf));
        lf.lfHeight = 160;
        lf.lfWeight = FW_BOLD;
        lf.lfEscapement = i;
        lf.lfOrientation = i;
        ::lstrcpy (lf.lfFaceName, _T ("Arial"));

        CFont font;
        font.CreatePointFontIndirect (&lf);

        CFont* pOldFont = dc.SelectObject (&font);
        dc.TextOut (0, 0, CString (_T ("          Hello, MFC")));

        //WHY THIS LINE?
        dc.SelectObject (pOldFont);
    }
}

このコードは、"Hello, MFC" を原点 (ウィンドウの中央に移動) の周りに円で表示します。

出力

その CFont ポインターが作成され、dc がそれをフォントとして選択するのはなぜですか? それは単なる良いプログラミングの練習ですか、それともこのアプリは実際にそれを必要としていますか?

Bitmaps やその他のデバイス コンテキスト オブジェクトでこれを行う同様のコードを Web で見たことがあります。目的は何ですか?

コードの最後の行を削除しても、何も変わりません。助けてくれてありがとう。

4

1 に答える 1

5

デバイス コンテキスト:

デバイス コンテキストは、一連のグラフィック オブジェクトとそれに関連する属性、および出力に影響するグラフィック モードを定義する構造です。グラフィック オブジェクトには、線画用のペン、塗りつぶし用のブラシ、画面の一部をコピーまたはスクロールするためのビットマップ、使用可能な色のセットを定義するためのパレット、クリッピングおよびその他の操作用の領域、およびペイントおよび描画操作。

いつでも、デバイス コンテキストに選択されたグラフィック オブジェクトは 1 つだけです。システムは、デバイス コンテキストの作成時に一連の既定のオブジェクトをデバイス コンテキストに格納するため、クリーンアップのためにデバイス コンテキストがシステムに戻されるときに、アプリケーションはその状態を保持する必要があります。それが

dc.SelectObject (pOldFont);

責任があります。

この要件は、SelectObjectの下に記載されています。

この関数は、指定されたタイプの以前に選択されたオブジェクトを返します。アプリケーションは、新しいオブジェクトで描画を終了した後、常に新しいオブジェクトを元の既定のオブジェクトに置き換える必要があります。


注: これは MFC とは関係ありませんが、Windows GDI とは関係ありません。MFC は、自動リソース管理ラッパーを実装するだけです。状態管理には、依然として明示的なコードが必要です。

于 2015-07-03T07:56:14.337 に答える