ダイアログボックスは、メッセージボックスより自由度の高いウィンドウを作ることができます。 これは、DialogBox関数を使います。
win123.cpp
//
// Windows プログラム
//
#include <windows.h>
#include <tchar.h>
// グローバル変数
HINSTANCE hInst; // 現在のインターフェイス
// ダイアログプロシージャ
INT_PTR CALLBACK DlgProc(HWND, UINT, WPARAM, LPARAM);
// アプリケーション開始位置
int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE, LPTSTR, int nCmdShow)
{
hInst = hInstance; // インスタンスハンドル保存
DialogBox(hInst, TEXT("MyDlgMain"), NULL, DlgProc);
}
// ダイアログプロシージャ
INT_PTR CALLBACK DlgProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
{
switch (msg)
{
case WM_CLOSE:
EndDialog(hWnd, LOWORD(wp));
return (INT_PTR)TRUE;
break;
}
return (INT_PTR)FALSE;
}
win123.rc
MyDlgMain DIALOG 0, 0, 186, 95 STYLE DS_3DLOOK | DS_CENTER | DS_SHELLFONT | WS_CAPTION | WS_VISIBLE | WS_GROUP | WS_TABSTOP | WS_THICKFRAME | WS_SYSMENU CAPTION "Windowsプログラム" FONT 9, "MS UI Gothic" BEGIN END
実行画面です。
WinMain関数の中は、DialogBox関数だけです。 これは次のように定義されています。
INT_PTR DialogBox( HINSTANCE hInstance, // モジュールのハンドル LPCTSTR lpTemplate, // ダイアログボックステンプレート HWND hWndParent, // オーナーウィンドウのハンドル DLGPROC lpDialogFunc // ダイアログボックスプロシージャ );
モジュールのハンドルには、WinMain関数で得られる hInst を代入します。 オーナーウィンドウはないので NULL を代入します。
テンプレートは、ダイアログボックスの見た目を決めるものです。 メッセージボックスの「テキスト・タイトル・スタイル」に相当します。 それどころか、Windows らしいウィンドウが作れてしまいます。 これは、ソースファイルとは別のファイルに書きます。 これは、単なるテキストファイルでリソースファイルと言います。 ファイル名は "win123.rc" とします。 その中の "MyDlgMain" を代入します。
リソースファイルには、ウィンドウのタイトルやスタイルなどを書きます。 BEGIN と END の間には、ボタンなどの部品を書きます。 しかし、説明するより、フリーのエディタ "ResEdit" を使えば楽にできます。
さて、ダイアログボックスが開きました。 メッセージボックスの場合、ボタンが押されたら閉じました。 どのボタンが押されたのかは数字で返しました。 ダイアログボックスの場合は次のようになります。
ダイアログボックスが開くと、やたら OS からメッセージがやってきます。 すると、DialogBox関数はプロシージャを呼びます。 それが "DlgProc" です。 プロシージャとは、メッセージを処理するためのものです。 ですから、プログラムはここへ書くことになります。 ところで、メッセージは、"WM_" で始まるマクロ定数になっています。
そのプロシージャで必ずしなければならないことがあります。 ダイアログボックスを閉じることです。 "×" が押されると、"WM_CLOSE" がやってきます。 その時に、EndDialog関数を使います。 これで DialogBox関数は終わり、WinMain関数も終わります。