<![CDATA[
ダイアログボックスの場合も、考え方は今まで作ってきたウィンドウのプログラムと同じです。
今まではウインドウに発生した色々な処理をウィンドウプロシージャに記述し処理していました。 ダイアログボックスの場合も同じです。ダイアログプロシージャを作成し、ダイアログに発生したいろいろな処理をダイアログプロシージャで受け取り、適切に処理します。
// SampleDialog002.cpp
//
// モードレスダイアログを作る
#include <windows.h>
#include "resource.h"
#define ID_BUTTON1 (0) // ボタンのID
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
BOOL CALLBACK DlgProc(HWND, UINT, WPARAM, LPARAM);
ATOM InitApp(HINSTANCE);
HWND InitInstance(HINSTANCE, int);
HWND hDlg; // モードレスダイアログボックスのハンドル
HINSTANCE hInst; // アプリケーションインスタンスハンドル
TCHAR szClassName[] = T("SampleDialog002");
// ウィンドウクラス。UNICODEとしての文字列定数
TCHAR szStr[4]; // ダイアログとのデータ受け渡し用。4文字確保(うち1つはNULLポインタ用)
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine,int nShowCmd)
{
MSG msg;
BOOL bRet;
HWND hWnd;
hInst = hInstance; // アプリケーションインスタンスハンドルをグローバル変数へ格納
if (!InitApp(hInstance))
return FALSE;
if (!(hWnd = InitInstance(hInstance,nShowCmd)))
return FALSE;
while((bRet = GetMessage(&msg, NULL, 0, 0)) != 0) {
if (bRet == -1){
break;
} else {
//ダイアログか
らのメッセージを処理する。
if(!IsDialogMessage(hDlg,&msg)){
// ダイアログで処理されなかったメッセージは
// ウィンドウプロシージャで処理する。
TranslateMessage(&msg); // 仮想キーメッセージを文字メッセージに変換
DispatchMessage(&msg); // メッセージをウィンドウプロシージャに送る
}
}
}
return (int)msg.wParam;
}
// ウィンドウクラスの登録
ATOM InitApp(HINSTANCE hInst)
{
WNDCLASS wc;
wc.style = CS_HREDRAW|CS_VREDRAW;
wc.lpfnWndProc = WndProc; // プロシージャ名
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInst;
wc.hIcon = NULL; // 未サポート
wc.hCursor = NULL; // 未サポート
wc.hbrBackground= (HBRUSH) COLOR_WINDOW;
wc.lpszMenuName = NULL; // 未サポート
wc.lpszClassName=(LPCTSTR) szClassName;
return (RegisterClass(&wc));
}
// ウィンドウの生成
HWND InitInstance(HINSTANCE hInst, int nShowCmd)
{
HWND hWnd;
hWnd = CreateWindow(szClassName,T("モードレス"),
WS_CLIPCHILDREN, // ウィンドウの種類
CW_USEDEFAULT, // x座標
&nbs
p;CW
USEDEFAULT, // y座標
CW_USEDEFAULT, // 幅
CW_USEDEFAULT, // 高さ
NULL, // 親ウィンドウのハンドル。親を作るのでNULL
NULL, // メニューハンドルまたは子ウィンドウID
hInst, // インスタンスハンドル
NULL);
if (!hWnd)
return FALSE;
ShowWindow(hWnd, nShowCmd);
UpdateWindow(hWnd);
return hWnd;
}
// ウィンドウプロシージャ
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
{
PAINTSTRUCT ps;
HDC hdc;
size_t size; // 文字列のサイズを格納する
HWND hButton;
HWND hDlg;
switch (msg){
case WM_CREATE: // 初期化処理開始
// モードレスダイアログを開くボタン
hButton = CreateWindow(
T("BUTTON"), // ウィンドウクラス名
_T("DIALOG"), // キャプション
WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, // スタイル指定
50, 50, // 座標
60, 40, // サイズ
hWnd, // 親ウィンドウのハンドル
HMENU(ID_BUTTON1), // メニューハンドル
hInst, &n
bsp;&nb
sp; // インスタンスハンドル
NULL // その他の作成データ
);
break;
case WM_PAINT:
hdc = BeginPaint(hWnd,&ps); // 描画処理を開始
StringCchLength(szStr,STRSAFE_MAX_CCH,&size); // 安全な文字列長取得
ExtTextOut(
hdc, // デバイスコンテキストのハンドル
0, // 開始位置(基準点)の x 座標
20, // 開始位置(基準点)の y 座標
NULL, // 長方形領域の使い方のオプション
NULL, // 長方形領域の入った構造体へのポインタ
szStr, // 文字列
size, // 文字数
NULL // 文字間隔の入った配列
);
EndPaint(hWnd,&ps);
break;
case WM_COMMAND:
switch (LOWORD(wp)){
case ID_BUTTON1:
// モードレスダイアログウィンドウを開く
hDlg = CreateDialog(
hInst, // アプリケーションのインスタンスのハンドル
MAKEINTRESOURCE(IDD_DIALOG1),
// ダイアログボックステンプレートを指定
hWnd, // 親ウィンドウのハンドル
DlgProc