メッセージボックス

作例

メッセージボックスを表示し,選択されたボタンを判別するプログラムを作ります。

作例-1 作例-2

#include <windows.h>

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
                   LPSTR lpszCmdLine, int nCmdShow)
{
    int id;

    id = MessageBox(NULL, TEXT("ボタンを押して下さい。"),
        TEXT(""), MB_OKCANCEL | MB_ICONQUESTION);

    switch (id)
    {
    case IDOK:
        MessageBox(NULL, TEXT("[OK] が押されました。"),
            TEXT("結果"), MB_ICONINFORMATION);
        break;
    case IDCANCEL:
        MessageBox(NULL, TEXT("[キャンセル] が押されました。"),
            TEXT("結果"), MB_ICONINFORMATION);
        break;
    }

    return 0;
}

MessageBox 関数

MessageBox 関数はメッセージボックスを表示する関数です。
世界に挨拶 で紹介済ですが,ここで改めて説明します。

MessageBox 関数 [MSDN]

メッセージボックスを表示します。

int MessageBox(
    HWND hWnd,          // オーナーウィンドウへのハンドル
    LPCTSTR lpText,     // テキスト
    LPCTSTR lpCaption,  // キャプション
    UINT uType          // メッセージボックスのタイプ
);
uType
メッセージボックスのタイプを指定します。ボタン,アイコン等はビット論理和で組み合わせて指定できます。
値 (ボタン)説明
MB_OKOK (既定)
MB_OKCANCELOK,キャンセル
MB_ABORTRETRYIGNORE中止,再試行,無視
MB_YESNOCANCELはい,いいえ,キャンセル
MB_YESNOはい,いいえ
MB_RETRYCANCEL再試行,キャンセル
MB_CANCELTRYCONTINUEキャンセル,再実行,継続
値 (アイコン)説明
MB_ICONHAND
MB_ICONSTOP
MB_ICONERROR
エラー
MB_ICONQUESTION 問合せ
MB_ICONEXCLAMATION
MB_ICONWARNING
警告
MB_ICONASTERISK
MB_ICONINFORNATION
情報
他に,既定のボタン,モーダル状態などのオプションを指定することもできます (MSDN 参照)。
返り値
どのボタンが選択されたかを表す値が返ります。
説明
IDOKOK
IDCANCELキャンセル
IDABORT中止
IDRETRY再試行
IDIGNORE無視
IDYESはい
IDNOいいえ
IDTRYAGAIN再実行
IDCONTINUE継続

ここでは紹介を割愛しますが,MessageBox 関数を拡張した MessageBoxEx 関数 [MSDN] も提供されています。

MessageBoxIndirect 関数

メッセージボックスの属性を表す構造体を用意しておいて,その構造体を元にメッセージボックスを作成する方法があります。
回りくどい方法ですが,1 度作成した構造体が再利用できることから,何回も同じ種類のメッセージボックスを作成する場合などに便利です。

構造体を利用してメッセージボックスを作成するには,MessageBoxIndirect 関数を使います。
次のプログラムは,MessageBoxIndirect 関数を用いてメッセージボックスを表示する例です。

作例

#include <windows.h>

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
                   LPSTR lpszCmdLine, int nCmdShow)
{
    MSGBOXPARAMS mbp;

    // 構造体をゼロクリア
    ZeroMemory(&mbp, sizeof mbp);

    // 構造体に属性を設定
    mbp.cbSize = sizeof mbp;
    mbp.hInstance = hInstance;
    mbp.lpszCaption = TEXT("Test");
    mbp.lpszText = TEXT("Hello, world!");
    mbp.dwStyle = MB_OK | MB_ICONASTERISK;

    // メッセージボックスを表示
    MessageBoxIndirect(&mbp);

    return 0;
}

MessageBoxIndirect のプロトタイプは,次の通りです。

MessageBoxIndirect 関数 [MSDN]

メッセージボックスを表示します。

int MessageBoxIndirect(
    LPMSGBOXARAMS lpmbp  // MSGBOXPARAMS 構造体
);
返り値
どのボタンが選択されたかを表す値が返ります (MessageBox 関数に同じ)。

メッセージボックスの属性を格納する MSGBOXPARAMS 構造体は,次のように定義されています。

MSGBOXPARAMS 構造体 [MSDN]

メッセージボックスの属性を表します。

typedef struct tagMSGBOXPARAMS
{
    UINT        cbSize;         // 構造体のサイズ
    HWND        hwndOwner;      // オーナーウィンドウ
    HINSTANCE   hInstance;      // インスタンス
    LPCTSTR     lpszText;       // テキスト
    LPCTSTR     lpszCaption;    // キャプション
    DWORD       dwStyle;        // メッセージボックスの種類
    LPCSTR      lpszIcon;       // アイコン
    DWORD_PTR   dwContextHelpId;  // ヘルプコンテキスト識別子
    MSGBOXCALLBACK lpfnMsgBoxCallback;  // コールバック関数
    DWORD       dwLanguageId;   // 言語識別子
} MSGBOXPARAMS;
dwStyle
MessageBox 関数の uType 引数と同様の値を指定します。

この構造体のすべてのメンバについて理解する必要はありません。
今回最初に構造体をゼロクリアし,興味のないメンバは何も値を設定していません。

構造体の最初のメンバ cbSize には,構造体のサイズをバイト数で指定します。
一見冗長に見えるこのメンバは,将来の構造体の拡張に備えて設けられています。

構造体のゼロクリアに用いたのは,Windows API に含まれる ZeroMemory マクロです。

ZeroMemory マクロ [MSDN]

メモリ領域をゼロクリアします。

void ZeroMemory(
    void *Destination,  // 始点アドレス
    size_t Length       // 長さ
);