Win32 API と MFC の対比
  Win32 API
(関数ライブラリ)
MFC
(クラスライブラリ)
説明
構築
WindowProc (不要)  ウィンドウプロシージャ。ウィンドウの振舞いや外観を制御する関数(各自で実装する)。
 MFC の場合、CWnd クラス等から派生したクラスを作成し、ウィンドウメッセージに対応したメンバ関数(オーバーライド)を作成して制御する。
RegisterClassEx AfxRegisterWndClass or
AfxRegisterClass
 ウィンドウクラスの登録。この登録情報にはウィンドウプロシージャが必要。
 MFC でウィンドウを作成する場合はウィンドウプロシージには AfxWndProc を渡す。
CreateWindowEx or
CreateWindow
CWnd::CreateEx or
CWnd::Create
 ウィンドウの作成。どのウィンドウクラスでウィンドウを作成するか指定する。
 ウィンドウクラスの登録とウィンドウの作成を分離することで同じ振舞いをするウィンドウを効率よく作成できる。
ウィンドウメッセージ
GetMessage (不要)  ウィンドウに送られてきたウィンドウメッセージを取得する。ウィンドウにメッセージが送られていなければ本関数の呼び出しから戻ってこない。
(本関数を呼び出すスレッドで作成したウィンドウのいづれかに送信されたウィンドウメッセージを取得する)
関連: PeekMessage
TranslateMessage (不要) -
DispatchMessage (不要)  GetMessage等で取得したウィンドウメッセージを各ウィンドウへ振り分ける(ウィンドウプロシージャを呼び出す)。
ウィンドウコントール
SendMessage CWnd::SendMessage  ウィンドウへメッセージを送信する。(同期)
 ウィンドウメッセージの送信先ウィンドウはウィンドウメッセージを処理する。
PostMessage CWnd::PostMessage  ウィンドウへメッセージを送信する。(非同期)
 ウィンドウメッセージの送信先ウィンドはウィンドウメッセージを処理せず、メッセージキューにウィンドウメッセージを登録するのみ。いつ処理するかは OS 任せとなる。
EnableWindow CWnd::EnableWindow  ウィンドウの有効/無効。
ShowWindow CWnd::ShowWindow  ウィンドウの表示/非表示など。
UpdateWindow CWnd::UpdateWindow  ウィンドウのクライアント領域を更新。
SetWindowPos CWnd::SetWindowPos  ウィンドウの移動や表示/非表示など。
ダイアログ
DialogProc DialogProc  ダイアログプロシージャ。役割はウィンドウプロシージャと同じ。
DialogBox CDialog::DoModal  ダイアログを表示する。(モーダル)
GetDlgItem CWnd::GetDlgItem  ダイアログ上のコントールのウィンドウハンドルを取得する。
SendDlgItemMessage CWnd::SendDlgItemMessage  ダイアログ上のコントールへウィンドウメッセージを送信する。
GetDlgItemText CWnd::GetDlgItemText  ダイアログ上のコントールのタイトルを取得する。
SetDlgItemText CWnd::SetDlgItemText  ダイアログ上のコントールのタイトルを設定する。
Win32 API(ウィンドウ)での処理の流れ
// ウィンドウプロシージャ LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { // ... 省略 ... return DefWindowProc(hWnd, uMsg, wParam, lParam); } // Windows アプリケーション・エントリーポイント int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE /*hPrevInstance*/, LPSTR /*lpszCmdLine*/, int /*nCmdShow*/ ) { RegisterClassEx( ... 省略 ... ); CreateWindowEx( ... 省略 ... ); ShowWindow( ... 省略 ... ); UpdateWindow( ... 省略 ... ); for (;;) { BOOL bResult = GetMessage(&msg, NULL, 0, 0); // ... 省略 ... TranslateMessage(&msg); DispatchMessage(&msg); } return 0; }
Win32 API(ダイアログ)での処理の流れ
// ダイアログプロシージャ INT_PTR CALLBACK DialogProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { INT_PTR nResult = FALSE; // ... 省略 ... return nResult; } // Windows アプリケーション・エントリーポイント int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE /*hPrevInstance*/, LPSTR /*lpszCmdLine*/, int /*nCmdShow*/ ) { DialogBox( ... 省略 ... ); return 0; }