簡単のために、ウィンドウを表示するだけのプログラムを例に解説します。以下のコードを実行することで、次のようなウィンドウが表示されます。
#include <windows.h> #define WND_CLS_NAME "MyWindowClass" // ウィンドウクラス名
ウィンドウへ送られたメッセージを処理します。
メッセージの種類はuMsg引数から判断し、それぞれのメッセージに応じた処理を実行します。ここで処理をしないメッセージはDefWindowProc()関数を呼び出すことで、既定の処理を実行させられます。
// ウィンドウ プロシージャ LRESULT CALLBACK WndProc( HWND hWnd, // ウィンドウのハンドル UINT uMsg, // メッセージの識別子 WPARAM wParam, // メッセージの1番目のパラメータ LPARAM lParam // メッセージの2番目のパラメータ ) { switch( uMsg ) { // ウィンドウが破棄された case WM_DESTROY: // スレッドの終了をシステムに伝える PostQuitMessage( 0 ); break; default; // ウィンドウメッセージの既定の処理を実行する return DefWindowProc( hWnd, uMsg, wParam, lParam ); } return 0; }
この関数が呼び出されるようにするには、ウィンドウクラスの登録時にWNDCLASS構造体のlpfnWndProcに対して、この関数のポインタを設定する必要があります。
WinMain()関数は、アプリケーションの起動時にWindowsシステムによって呼び出されます。処理の概略は次のようになります。
WM_QUITメッセージを受け取るまで、メッセージを処理するループをくり返します。
// Win32アプリケーションの初期エントリポイント int WINAPI WinMain( HINSTANCE hInst, // 現在のインスタンスのハンドル HINSTANCE hPrevInst, // 以前のインスタンスのハンドル LPSTR lpCmdLine, // コマンドライン int nCmdShow // 表示状態 ) { WNDCLASS wndcls; ZeroMemory( &wndcls, sizeof( wndcls ) ); wndcls.lpfnWndProc = WndProc; // ウィンドウ プロシージャのアドレス wndcls.hInstance = hInst; // ウィンドウ プロシージャを持つプログラムのインスタンス ハンドル wndcls.hbrBackground = ( HBRUSH )COLOR_BACKGROUND; // ウィンドウの背景色 wndcls.lpszClassName = WND_CLS_NAME; // このウィンドウクラスの登録名 // ウィンドウクラスを登録する if( RegisterClass( &wndcls ) == 0 ) { // ウィンドウクラスの登録に失敗した return 0; } // ウィンドウを作成する HWND hWnd = CreateWindow( WND_CLS_NAME, // ウィンドウクラス名 "My Window", // ウィンドウの名前 WS_OVERLAPPEDWINDOW, // ウィンドウ固有のスタイル CW_USEDEFAULT, // 表示位置 x座標 CW_USEDEFAULT, // 表示位置 y座標 CW_USEDEFAULT, // 表示サイズ 幅 CW_USEDEFAULT, // 表示サイズ 高さ 0, // 親ウィンドウのハンドル 0, // メニューのハンドル hInst, // ウィンドウを作成するプログラムのインスタンスハンドル NULL // WM_CREATEメッセージに渡すパラメータ ); if( hWnd == NULL ) { // ウィンドウの作成に失敗した return 0; } // ウィンドウを表示する ShowWindow( hWnd, nCmdShow ); // ウィンドウのクライアントエリアを更新する UpdateWindow( hWnd ); MSG msg; // スレッドのメッセージキューからメッセージを取得する while( GetMessage( &msg, NULL, 0, 0 ) ) { // ウィンドウ プロシージャへメッセージをディスパッチ (送出) する DispatchMessage( &msg ); } // WM_QUITメッセージのwParamパラメータを返し、アプリケーションを終了させる return msg.wParam; }