|
ダイアログボックスを使用するには必要なものが3つあります
定義されたリソースには「名前」が付けられます。以後その名前でそのダイアログはプログラムの中で識別される事となります
メッセージハンドラは、About をコピーして使用して下さい
メッセージハンドラは「関数」なので、名前を「MyDialog」として宣言する必要があります
宣言も About のものをコピーして使用します
呼び出す記述は以下のようになります
IDD_DIALOG が定義されたリソースでの「名前」であり、MyDialog がメッセージハンドラの関数名になります
|
|
ダイアログだけを学ぶ為に、親ウインドウが表示される前にダイアログを表示して、ダイアログが閉じられた時に、同時に親ウインドウも破棄してプログラムを終わらせます。
|
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;
TCHAR szHello[MAX_LOADSTRING];
LoadString(hInst, IDS_HELLO, szHello, MAX_LOADSTRING);
switch( message ) {
case WM_CREATE:
DialogBox(hInst, (LPCTSTR)IDD_DIALOG, hWnd, (DLGPROC)MyDialog);
DestroyWindow( hWnd );
break;
| |
|
WM_CREATEメッセージは、ウィンドウの作成時に送られ、ウィンドウが作成された後 (メインウインドウがスケルトンのままの表示スタイルであれば、ウィンドウが表示される前) にこのメッセージを受け取ります。このメッセージを処理後、0を返すとウィンドウの作成は通常通り続けられますが、-1を返すとウインドウは破棄されてウインドウを作成しようとした関数の戻り値としてNULLが返されます
ですから、上記のソースコードは以下のようにも書き換える事ができます
|
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;
TCHAR szHello[MAX_LOADSTRING];
LoadString(hInst, IDS_HELLO, szHello, MAX_LOADSTRING);
switch( message ) {
case WM_CREATE:
DialogBox(hInst, (LPCTSTR)IDD_DIALOG, hWnd, (DLGPROC)MyDialog);
return -1;
| |
|
タスクバーにアイコン表示するには
|
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;
TCHAR szHello[MAX_LOADSTRING];
LoadString(hInst, IDS_HELLO, szHello, MAX_LOADSTRING);
switch( message ) {
case WM_CREATE:
ShowWindow( hWnd, SW_SHOWMINIMIZED );
DialogBox(hInst, (LPCTSTR)IDD_DIALOG, hWnd, (DLGPROC)MyDialog);
return -1;
| |
|
|
|
まず、ボタン毎に処理を分けます
WM_INITDIALOGメッセージ は、ダイアログボックスが表示される直前に発生しますこの時、lParam の値はDialogBoxParam関数」でダイアログが作成された時に引き渡された値です。つまり、「DialogBox関数」を使わずに、「DialogBoxParam関数」を使うと、ダイアログ作成時に値を引き渡す事ができます。wParam には、最初にフォーカスされるコントロールのウインドウハンドルが入っておりそのコントロールに正しくフォーカスされるようにするには、0 以外を return しなければなりません。
逆に、初期フォーカスを変更したい場合は以下のように記述します
EndDialog はダイアログを終了させる関数です。
ここで、LOWORD(wParam)は、DialogBox関数の戻り値となります。
|
|