ダイアログの使用

  必要なもの



ダイアログボックスを使用するには必要なものが3つあります

  • ダイアログの表示イメージが定義されたリソース
  • そのダイアログ専用のメッセージハンドラ
  • ダイアログを呼び出す記述

  • 定義されたリソースには「名前」が付けられます。以後その名前でそのダイアログはプログラムの中で識別される事となります

    メッセージハンドラは、About をコピーして使用して下さい

      
    LRESULT CALLBACK MyDialog( HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam )
    {
    	switch( message ) {
    		case WM_INITDIALOG:
    			return TRUE;
    
    		case WM_COMMAND:
    			if( LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL ) {
    				EndDialog(hDlg, LOWORD(wParam));
    				return TRUE;
    			}
    			break;
    	}
    	return FALSE;
    }
    
      

    メッセージハンドラは「関数」なので、名前を「MyDialog」として宣言する必要があります

    宣言も About のものをコピーして使用します

      
    
    LRESULT CALLBACK	MyDialog( HWND, UINT, WPARAM, LPARAM );
    
    
      

    呼び出す記述は以下のようになります

      
    
    DialogBox(hInst, (LPCTSTR)IDD_DIALOG, hWnd, (DLGPROC)MyDialog);
    
    
      

    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;
    
    
      



      メッセージハンドラの意味

    まず、ボタン毎に処理を分けます

      
    LRESULT CALLBACK MyDialog( HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam )
    {
    	switch( message ) {
    		case WM_INITDIALOG:
    			return TRUE;
    
    		case WM_COMMAND:
    			if( LOWORD(wParam) == IDOK ) {
    				return TRUE;
    			}
    			if( LOWORD(wParam) == IDCANCEL ) {
    				EndDialog(hDlg, LOWORD(wParam));
    				return TRUE;
    			}
    			break;
    	}
    	return FALSE;
    }
    
      

    WM_INITDIALOGメッセージ は、ダイアログボックスが表示される直前に発生しますこの時、lParam の値はDialogBoxParam関数」でダイアログが作成された時に引き渡された値です。つまり、「DialogBox関数」を使わずに、「DialogBoxParam関数」を使うと、ダイアログ作成時に値を引き渡す事ができます。wParam には、最初にフォーカスされるコントロールのウインドウハンドルが入っておりそのコントロールに正しくフォーカスされるようにするには、0 以外を return しなければなりません。

    逆に、初期フォーカスを変更したい場合は以下のように記述します

      
    LRESULT CALLBACK MyDialog( HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam )
    {
    	switch( message ) {
    		case WM_INITDIALOG:
    			SetFocus( GetDlgItem( hDlg, IDCANCEL ) );
    			return FALSE;
    
    		case WM_COMMAND:
    			if( LOWORD(wParam) == IDOK ) {
    				return TRUE;
    			}
    			if( LOWORD(wParam) == IDCANCEL ) {
    				EndDialog(hDlg, LOWORD(wParam));
    				return TRUE;
    			}
    			break;
    	}
    	return FALSE;
    }
    
      

    EndDialog はダイアログを終了させる関数です。
    ここで、LOWORD(wParam)は、DialogBox関数の戻り値となります。





      ダイアログ定義のプロジェクト間でのコピー

    カレントプロジェクトの、「ワークスペース」「ResourceView」タブを開いて、タイアログツリーを開いてメニューの「開く」で他のプロジェクトのリソースファイル( 拡張子 .rc ) を開きます

    リソースファイル内のコピーしたいダイアログを CTRL キーを押しながら ドラッグドロップして下さい










      infoboard   管理者用   
    このエントリーをはてなブックマークに追加





    フリーフォントWEBサービス
    SQLの窓WEBサービス

    SQLの窓フリーソフト

    素材

    一般WEBツールリンク

    SQLの窓

    フリーソフト

    JSライブラリ