メインウインドウを表示させないダイアログボックスだけのアプリケーションを作成します。
WinMain関数 - インコのWindowsSDK を修正して、ウインドウを表示するようにします。
リソースファイルとヘッダファイルをプロジェクトに追加
リソースファイルtest.rcと、resource.hをプロジェクトに追加して下さい。
Visual C++ 2010 リソースファイル追加
を参照して下さい。
C言語 ソースファイル
1.WinMain()で、ダイアログボックスを作成する関数DialogBox()を実行
INT_PTR DialogBox( HINSTANCE hInstance, // モジュールのハンドル LPCTSTR lpTemplate, // ダイアログボックステンプレート HWND hWndParent, // 親ウィンドウのハンドル DLGPROC lpDialogFunc // ダイアログボックスプロシージャ );
DialogBox()の2つ目の引数「ダイアログボックステンプレート」は、リソースファイルtest.rcで使用するダイアログボックステンプレートと同じ変数名にしてください。
DialogBox()の最後の引数は、「ダイアログボックスプロシージャ」です。これは、後で説明します。
メッセージとは
ユーザーがキーを押した、マウスを移動した、メニューを実行したなどの動作は、メッセージと言う形で、 やりとりしています。
メッセージは整数の値です。普通は、整数の値そのままで使わず、WM_から始まるシンボルを使います。
例えば、「ウインドウ閉じるときののメッセージ」は、WM_CLOSEです。
#define WM_CLOSE 0x0010
と定義されていますので、実際の値は0x10(=16)です。
ウィンドウプロシージャとは
ウィンドウプロシージャとは、メッセージを処理する関数です。
今回のようにダイアログボックスで使用するウィンドウプロシージャのことを、ダイアログボックスプロシージャと呼びます。
ウィンドウプロシージャの名前は任意です。DialogProcとします。
LRESULT CALLBACK ######( HWND hWnd, // メッセージが発生したウィンドウのハンドル UINT msg, // メッセージ コード WPARAM wParam, // メッセージの付加情報(メッセージコードにより異なります) LPARAM lParam // メッセージの付加情報(メッセージコードにより異なります) );
戻り値のLRESULTはLONG_PTR型、すなわちポインタ型のことです。
CALLBACKは、呼び出し規約(スタックというメモリ領域の利用の仕方を決めたもの)です。
#define CALLBACK __stdcall
とLpmApi.hで定義されています。したがってCALLBACKは、__stdcallと同じ意味です。WINAPIも__stdcallと定義されていますので、同じ呼び出し規約です。
CALLBACKをつけた関数は、コールバック関数と呼ばれますが、メッセージを処理する関数の場合は、ウィンドウプロシージャと呼ぶことが多いです。
wParamと、lParamは、メッセージの付加情報です。表記は決まっていないため、wp、lpと書くこともあります。
wParamは、"Word Parameter"からきています。Win16環境では16ビット長、Win32環境では32ビット長、Win64環境では64ビット長です。
lParamは、"Long Parameter"からきています。Win16環境とWin32環境では32ビット長、Win64環境では64ビット長です。
2つ目の引数 message によって、wParamとlParamに、何が入るかは変わってきます。
ウィンドウプロシージャの処理
1.ダイアログボックスプロシージャ(ウィンドウプロシージャ)の2つめの引数 msg によって、メッセージを判断します。
2.ダイアログボックスプロシージャで、ウインドウを閉じるメッセージ(WM_CLOSE)がきたら、 ダイアログボックスを閉じる関数EndDialog()を実行
BOOL EndDialog( HWND hDlg, // ダイアログボックスのハンドル INT_PTR nResult // ダイアログボックスへ戻す )
※EndDialog()がないと、ウインドウを閉じることが、できなくなります。
リソースファイル
ダイアログボックス [DIALOG]
template DIALOG, x0, y0, width, height
template | ダイアログボックステンプレート CソースファイルにあるDialogBox()の第2引数と、同じ変数名にしてください |
x0 | ダイアログボックス左上のx座標 |
y0 | ダイアログボックス左上のy座標 |
width | ダイアログボックスの幅 |
height | ダイアログボックスの高さ |
方法1 : Visual Studioのリソース ビューからダイアログボックスを追加
Visual Studio Expressでは、この方法は利用できません。
Visual Studio Express 以外の場合は、Visual Studioからダイアログボックスを追加できます。
右上のウインドウから「リソース ビュー」のシートをクリック。
リソースファイルを右クリックして、メニューを開き、「リソースの追加(A)...」を選択してください。
「リソースの追加」ダイアログが開くので、リソースの種類(T):「Dialog」を選択してから、 「新規作成」ボタンをクリックしてください。
ダイアログボックスのサイズを変更する場合は、プレビュー画面のDrag&Dropで変えてください。
方法2 : Reseditからダイアログボックスを追加
ここでは、Reseditで作成する方法も説明します。
Reseditでは、*.rcファイルと、resource.hファイルを生成できます。
ResEditで作成する場合は、 左上の「リソース(Resources)」ウインドウを右クリックし、「リソースの追加(Add Resource)...」 - 「ダイアログ(Dialog) Ctrl+D」を選択
IDO_DIALOG1を右クリック - 「名前の変更(Rename)」 でダイアログボックステンプレートの変更
プレビュー画面のDrag&Dropでダイアログボックスのサイズ・位置を変更
(下図のようにプロパティ(Properties)画面で、直接サイズ・位置を入れることも可能)
タイトル [CAPTION]
ウインドウのタイトルバーに表示させるタイトルを入れます。
これがないと、ウインドウのタイトルバーが表示されません。したがって、タイトルバー右上にあるウインドウを閉じるボタンが表示されません。 ただし、「Alt」キーを押しながら、「F4」を押せば、ウインドウを閉じることができます。
CAPTION "title_name"
title_name | タイトル名 |
・ResEdit、Visual Studioのリソース ビューでの設定
下図のようにプロパティ(Properties)画面のCaptionに、ウインドウのタイトルバーに表示させるタイトルを入れてください。
BEGINとENDの間に入れるコード
BEGIN END
BEGINとENDの間に、ダイアログに表示させるものを入れます。
今回は何も表示させないので、何も入れません。
BEGINとENDがないと、コンパイルエラーになります。
ソースコードの入力
ソースコードは下記のように入れてください。
Reseditを使う場合は、resource.hと、test.rcがReseditで生成できます。
#include <windows.h> // このコード モジュールに含まれる関数の宣言を転送します: BOOL CALLBACK DialogProc(HWND, UINT, WPARAM, LPARAM); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR lpCmdLine, int nCmdShow ) { DialogBox(hInstance, TEXT("DIALOG_BOX"), NULL, DialogProc); return 0; } BOOL CALLBACK DialogProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_CLOSE: EndDialog(hWnd, IDOK); return TRUE; } return FALSE; }
今回の resource.h は、空ファイルです。
Reseditで作成した場合は、これとは異なるソースコードになります。
#include "resource.h"
/////////////////////////////////////////////////////////////////////////////
//
// ダイアログ
//
DIALOG_BOX DIALOG 0, 0, 170, 62
CAPTION "ダイアログ"
BEGIN
END
Reseditで作成した場合は、これとは異なるソースコードになります。