ウィンドウを表示するだけのWindowsアプリケーションを用いた、Win32アプリケーションの解説

簡単のために、ウィンドウを表示するだけのプログラムを例に解説します。以下のコードを実行することで、次のようなウィンドウが表示されます。

ヘッダのインクルード

#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に対して、この関数のポインタを設定する必要があります。

Win32アプリケーションの初期エントリポイント

WinMain()関数は、アプリケーションの起動時にWindowsシステムによって呼び出されます。処理の概略は次のようになります。

ウィンドウの作成

  1. ウィンドウクラスの登録 : RegisterClass | MSDN
  2. ウィンドウの作成 : CreateWindow
  3. ウィンドウの表示 : ShowWindow | MSDN

メッセージの処理

WM_QUITメッセージを受け取るまで、メッセージを処理するループをくり返します。

  1. メッセージキューからメッセージを取得 : GetMessage
  2. ウィンドウ プロシージャへメッセージを送信 : DispatchMessage | MSDN
// 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;
}
MSDN (Microsoft Developer Network) から検索