メインウィンドウ

ダイアログボックスは、メッセージボックスより自由度の高いウィンドウを作ることができます。 これは、DialogBox関数を使います。

ダイアログボックス(win123)

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関数も終わります。


[前] [目次] [次]