OnDraw() と OnPaint() はどう違うのか?

メモ:  Category:sdk_mfc

OnPaint()はWM_PAINTに対したハンドラで、OnDraw()はViewのOnPaint()からも呼ばれています。

CWndのOnPaint()のヘルプを覗いてみると、「ドキュメント/ビュー アプリケーションのイメージのレンダリングの詳細については、CView::OnDraw の説明を参照してください。」と書いてあります。

OnDraw()は CViewのメンバ関数でダイアログベースでは OnDraw() は存在しません。

OnPaint()はCWndのメンバ関数となっています。

CViewのOnDrawのヘルプを覗いてみると「フレームワークは、画面表示、印刷、および印刷プレビューを実行するためにこの関数を呼び出す」と書いてあります。

OnPaint() はウィンドウの描画用で,OnDraw()はウィンドウ描画,印刷,印刷プレビューなどに使うもののようです。

SDIやMDIアプリケーションの描画処理は OnDraw() で行い(印刷や印刷プレビューも)。

ダイアログベースでは OnPaint()で描画処理を行うようです。

また,WM_PAINT はプログラムからは直接呼んではいけないとのことです(どこかのサイトより)。

では,画面を更新するにはどうしたらよいのか?

CWnd::InvalidateRect() や CWnd::UpdateWindow() を使用します。

CViewの中で行われている事

void CView::OnPaint()
{
    // standard paint routine
    CPaintDC dc(this);
    OnPrepareDC(&dc);
    OnDraw(&dc);
}

CDialogの中で行われている事

void CDialog::OnPaint()
{
    CPaintDC dc(this);
    if (PaintWindowlessControls(&dc)){
        return;
    }
    Default();
}

bluenote by BBB