Dialog Procedure

Date: 05-Jun-2000
(c) Copyright 1997-2000 by H.Fujii

[前へ][次へ]

前回 Dialog Template を書いたので、 ここでは、このメッセージを処理する関数を用意し、名前を MyCmndProcとしましょう。書き方は、 以前にやった Window Procedure と、ほぼ同じです。

#define STRICT
#include <windows.h>
#include "resource.h"

BOOL CALLBACK MyCmndProc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
  WORD wNotifyCode;
  WORD wID;

  switch( uMsg )
  {
  case WM_COMMAND:
    wNotifyCode = HIWORD( wParam );
    wID = LOWORD( wParam );
    if( (wID == IDOK) || (wID == IDCANCEL) )
    {
      EndDialog( hDlg, (int)wID );
      return TRUE;
    }
    break;
  default:
    break;
  }
  return FALSE;
}
EndDialog()で Dialog Window が破棄されます。この時、親 Window へ 戻り値を渡すことができます。ここでは、wID をそのまま渡して います。

これで一応 Dialog Box を表示する準備ができたので、Main Menu の "File"-"Command"(すなわち、ID_FILE_CMND を伴う WM_COMMAND メッセージ)に対して、この Dialog Box を表示するように します。そのためには、前の WndProcWM_COMMAND メッセージの処理部分を

BOOL CALLBACK MyCmndProc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam );
void OnPaint( HDC hdc );

LRESULT CALLBACK WndProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
  WORD wNotifyCode;
  WORD wID;
  HDC hdc;
  PAINTSTRUCT ps;
  HINSTANCE hInst;

  switch( uMsg )
  {
  case WM_COMMAND:
    wNotifyCode = HIWORD( wParam );
    wID = LOWORD( wParam );
    switch( wID )
    {
    case ID_FILE_EXIT:
      DestroyWindow( hwnd );
      break;
    case ID_FILE_CMND:
      hInst = (HINSTANCE)GetWindowLong( hwnd, GWL_HINSTANCE );
      DialogBox( hInst, "MyCmndDlg", hwnd, (DLGPROC)MyCmndProc );
      break;
    default:
      MessageBox( NULL, "Sorry. Not implemented yet.", "My Program", MB_OK );
      break;
    }
    break;
           :
とします。この時、DialogBox() の戻り値は、EndDialog() で 設定した戻り値になっているので、それに応じて処理を変えることができますが、 この例では何もしていません。
[前へ][次へ]