ダイアログボックスの作成

ダイアログボックス1

メインウインドウを表示させないダイアログボックスだけのアプリケーションを作成します。

WinMain関数 - インコのWindowsSDK を修正して、ウインドウを表示するようにします。

C言語 ソースファイル

1.WinMain()で、ダイアログボックスを作成する関数DialogBox()を実行

INT_PTR DialogBox(
    HINSTANCE hInstance,  // モジュールのハンドル
    LPCTSTR lpTemplate,   // ダイアログボックステンプレート
    HWND hWndParent,      // 親ウィンドウのハンドル
    DLGPROC lpDialogFunc  // ダイアログボックスプロシージャ
);

DialogBox()の2つ目の引数「ダイアログボックステンプレート」は、リソースファイルWindowsProject1.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に、何が入るかは変わってきます。 lParamは、最新のVisual Studioでは、(DLGPROC)でキャストしないとコンパイルエラーになります。

ウィンドウプロシージャの処理

1.ダイアログボックスプロシージャ(ウィンドウプロシージャ)の2つめの引数 msg によって、メッセージを判断します。

2.ダイアログボックスプロシージャで、ウインドウを閉じるメッセージ(WM_CLOSE)がきたら、 ダイアログボックスを閉じる関数EndDialog()を実行

BOOL EndDialog(
    HWND hDlg,        // ダイアログボックスのハンドル
    INT_PTR nResult   // ダイアログボックスへ戻す
)

※EndDialog()がないと、ウインドウを閉じることが、できなくなります。

リソースファイル

ダイアログボックス [DIALOG]

リソースファイルのソースコードを直接手入力する方法と、Visual Studioのリソースビューから入力する方法を説明します。 どちら片方を選択してください。

ソースコードを直接手入力する場合

右側の「ソリューション エクスプローラー」の該当のリソースファイルを右クリックして、メニューを表示させ、 「コードの表示(C)」を選択。

VSC3

これで、リソースファイルのソースコードを編集できるようになります。

template          DIALOG, x0, y0, width, height

templateダイアログボックステンプレート
CソースファイルにあるDialogBox()の第2引数と、同じ変数名にしてください
x0ダイアログボックス左上のx座標
y0ダイアログボックス左上のy座標
widthダイアログボックスの幅
heightダイアログボックスの高さ

Visual Studioのリソース ビューからダイアログボックスを追加する場合

Visual Studio Expressでは、この方法は利用できません。

Visual Studio Express 以外の場合は、Visual Studioからダイアログボックスを追加できます。

Visual Studioで、「Windows デスクトップ アプリケーション」を選択して、プロジェクトを作成した場合は、 既にダイアログボックスが存在するため、下記操作は不要です。

右上のウインドウから「リソース ビュー」のシートをクリック。
リソースファイルを右クリックして、メニューを開き、「リソースの追加(A)...」を選択してください。

VSC1

「リソースの追加」ダイアログが開くので、リソースの種類(T):「Dialog」を選択してから、 「新規作成(N)」ボタンをクリックしてください。

VSC2

ダイアログボックスのサイズを変更する場合は、プレビュー画面のDrag&Dropで変えてください。

VSC3

タイトル [CAPTION]

ウインドウのタイトルバーに表示させるタイトルを入れます。

これがないと、ウインドウのタイトルバーが表示されません。したがって、タイトルバー右上にあるウインドウを閉じるボタンが表示されません。 ただし、「Alt」キーを押しながら、「F4」を押せば、ウインドウを閉じることができます。

CAPTION  "title_name"

title_nameタイトル名

Visual Studioのリソースビューからダイアログボックスを追加する場合

下図のようにプロパティ画面の「キャプション」に、ウインドウのタイトルバーに表示させるタイトルを入れてください。

VCwin32アプリケーション6

BEGINとENDの間に入れるコード

ソースコードを直接手入力する場合

BEGIN
END

BEGINとENDの間に、ダイアログに表示させるものを入れます。
今回は何も表示させないので、何も入れません。

BEGINとENDがないと、コンパイルエラーになります。

Visual Studioのリソースビューからダイアログボックスを追加する場合

Visual Studioが自動でソースコードを生成するため、BEGINとENDの間に入れるコードは考慮する必要はありません。

ソースコードの入力

ソースコードは下記のように入れてください。

WindowsProject1.cpp
#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, (DLGPROC)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 (空ファイル)

今回のResource.h は、空ファイルです。

WindowsProject1.rc
#include "Resource.h"

/////////////////////////////////////////////////////////////////////////////
//
// ダイアログ
//

DIALOG_BOX DIALOG 0, 0, 170, 62
CAPTION "ダイアログ"
BEGIN
END