世界に挨拶

スポンサーリンク

Hello World

次のようなメッセージボックスを表示するプログラムを作ります。

作例

#include <windows.h>

int WINAPI WinMain(
    HINSTANCE hInstance, HINSTANCE hPrevInstance,
    LPSTR lpszCmdLine, int nCmdShow)
{
    MessageBox(NULL, TEXT("Hello, world!"), TEXT("Test"), MB_OK);

    return 0;
}

普通の C のプログラムとは,次のような点が違います。

  • ヘッダファイル windows.h をインクルードしている。
  • main 関数の代わりに WinMain 関数が書かれている。
  • 関数名 WinMain の直前に WINAPI と書かれている。
  • HINSTANCE, LPSTR といった見知らぬ型がある。→ データ型 で説明
  • 文字列に見知らぬマクロ TEXT(...) が付いている。→ Unicode 対応 で説明

ヘッダファイル windows.h

windows.h は Windows API を利用するために必要なヘッダファイルです。

windows.h は幾つかの子ヘッダファイルをインクルードするマスターインクルードファイルで,例えば次のようなヘッダファイルをインクルードします。

  • windef.h: 固有データ型の定義
  • winbase.h: カーネル機能
  • wingdi.h: グラフィックス関連
  • winuser.h: ユーザ向け関数の宣言

WinMain 関数

Windows プログラムは,main 関数の代わりに WinMain 関数をエントリポイントとします。

WinMain 関数 [MSDN]

Windows プログラムのエントリポイントです。

int WINAPI WinMain(
    HINSTANCE hInstance,       // 現在のインスタンスへのハンドル
    HINSTANCE hPrevInstance,   // 以前のインスタンスへのハンドル
    LPSTR lpCmdLine,           // コマンドライン引数
    int nCmdShow               // 表示状態のオプション
);
hInstance
現在のアプリケーションを一意に示す識別値が入ります。
hPrevInstance
Win16 時代の遺物です。Win32 では常に NULL が入ります。
lpCmdLine
コマンドライン引数が入ります。
nCmdShow
ウィンドウの表示状態を表す値が入ります。→ ウィンドウの作成 で説明
返り値
WM_QUIT メッセージの wParam 値を指定します。→ ウィンドウプロシージャ で説明

現在の段階では,WinMain 関数の各引数の意味を理解する必要はありません。

関数名 WinMain の直前に書かれている WINAPI は呼び出し規約 (calling convention) と呼ばれ,関数の呼び出し方式を表します。

MessageBox 関数

MessageBox 関数はメッセージボックスを表示する関数です。

MessageBox 関数 [MSDN]

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

int MessageBox(
    HWND hWnd,          // オーナーウィンドウへのハンドル
    LPCTSTR lpText,     // テキスト
    LPCTSTR lpCaption,  // キャプション
    UINT uType          // メッセージボックスのタイプ
);

この関数の詳細は メッセージボックス で改めて説明します。

第 1 引数の hWnd には,オーナーウィンドウとするウィンドウを指定します。
今回は NULL を指定して,オーナーウィンドウを持たないメッセージボックスを作成しました。

第 2,第 3 引数は,それぞれメッセージボックスのテキスト,キャプションを指定します。

第 4 引数の uType には,メッセージボックスのタイプを表す整数値を指定します。
ここで指定する値には,winuser.h で定義されている次のような値が使えます。

// ボタンの種類
#define MB_OK                       0x00000000L  // OK
#define MB_OKCANCEL                 0x00000001L  // OK, キャンセル
#define MB_ABORTRETRYIGNORE         0x00000002L  // 中止,再試行,無視
#define MB_YESNOCANCEL              0x00000003L  // はい,いいえ,キャンセル
#define MB_YESNO                    0x00000004L  // はい,いいえ
#define MB_RETRYCANCEL              0x00000005L  // 再試行,キャンセル
#define MB_CANCELTRYCONTINUE        0x00000006L  // キャンセル,再実行,継続

// アイコンの種類
#define MB_ICONHAND                 0x00000010L  // エラー
#define MB_ICONQUESTION             0x00000020L  // 問合せ
#define MB_ICONEXCLAMATION          0x00000030L  // 警告
#define MB_ICONASTERISK             0x00000040L  // 情報

Windows プログラミングではこのような大文字の識別子が大量に出現しますが,それらは #define で定義された記号定数やマクロ (型の場合は typedef で定義された別名) です。
記号定数の多くは MB_ のような接頭辞が付いていて,その記号定数の使途を表しています (MB は message box の意)。

今回の uType の値はビットフィールドになっていて,ビット単位の論理和演算子 | で組み合わせることができます。
例えば,次のように書くと MB_YESNOCANCEL と MB_ICONEXCLAMATION の組合せを表現できます。

MessageBox(NULL, TEXT("..."), TEXT("..."),
           MB_YESNOCANCEL | MB_ICONEXCLAMATION);

これを利用すれば,メモ帳などの終了時に表示される,次のようなダイアログボックスを作ることができます。

ダイアログボックス

#include <windows.h>

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
                   LPSTR lpszCmdLine, int nCmdShow)
{
    MessageBox(NULL, TEXT("変更を保存しますか?"), TEXT("メモ帳"),
        MB_YESNOCANCEL | MB_ICONEXCLAMATION);

    return 0;
}
スポンサーリンク