OnDraw() と OnPaint() はどう違うのか?
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();
}