S-JIS[2006-07-30/2007-10-31]

ダイアログ作成方法

VC++4.0のMFCを使わないプロジェクトにおいてダイアログを使用する方法。


コーディング手順

  1. プロジェクトへリソースを追加する。(既に存在していれば不要)
    1. メニューバーの「挿入(I)」→「リソース(R)」で「リソースの挿入」ダイアログを開く。
    2. 「リソースの種類(T)」から「Dialog」を選択する。
    3. ダイアログを保存する。(編集は後からゆっくりやればいい)
      リソースのファイル名は「resource.rc」とする。(他の名前だと、リンクがバグって失敗することがあるっぽい)
      保存すると、「resource.h」というヘッダーファイルが自動的に作られる。これはrcファイルの名前によらず、常に「resource.h」というファイル名になる。
    4. メニューバーの「挿入(I)」→「プロジェクトへファイルを追加(I)」で「resource.rc」ファイルを プロジェクトに追加する。
       
  2. ダイアログをリソースエディタで編集する。(MFCの場合と同じ)
    ここでダイアログにIDを付けておく。(例えばIDD_DLG_TEST
     
  3. ダイアログの動作をコーディングする。
    #include <windows.h>
    #include "resource.h"
    
    BOOL CALLBACK DlgTestProc(HWND hWnd, UINT uiMsg, WPARAM wParam, LPARAM lParam)
    {
    	switch(uiMsg) {
    	case WM_INITDIALOG:
    		グローバル変数等の値をダイアログの初期値としてセット
    		…
    		return TRUE;
    
    	case WM_COMMAND:
    		if(LOWORD(wParam) == IDOK) {
    			//OKボタンが押されたときの処理
    			ダイアログから値を取得し、グローバル変数やiniファイル等へセット
    			…
    			EndDialog(hWnd, IDOK);
    			return TRUE;
    		} else
    		if(LOWORD(wParam) == IDCANCEL) {
    			EndDialog(hWnd, IDCANCEL);
    			return TRUE;
    		}
    		break;
    
    	default:
    		break;
    	}
    	return FALSE;
    }
  4. ダイアログの呼び出しをコーディングする。
    //ウィンドウプロシージャ
    LRESULT CALLBACK WndProc(HWND hWnd, UINT uiMsg, WPARAM wParam, LPARAM lParam)
    {
    	switch(uiMsg) {
    	〜
    	case WM_LBUTTONUP:
    		DialogBox(NULL, MAKEINTRESOURCE(IDD_DLG_TEST), hWnd, (DLGPROC)DlgTestProc);
    		return 0;
    	〜
    	}
    
    	return DefWindowProc(hWnd, uiMsg, wParam, lParam);
    }

値の設定・取得

リソースエディタでダイアログにテキストボックス等を貼り付けてIDを付けると、ソースからはそのIDを使って値の設定・取得が出来る。

値の設定・取得には、ダイアログ用のAPIが用意されている。
MFCのCWndのクラスメンバのヘルプで「ダイアログ ボックス項目関数」の項にある関数が使える。
関数名は同じで、第1引数にダイアログのHWNDを追加してやればよい。

コントロール 設定 取得 更新日
テキストボックス char *val = "値";
SetDlgItemText(hWnd, IDC_EDT_TEST, val);
char val[サイズ];
if(GetDlgItemText(hWnd, IDC_EDT_TEST, val, sizeof(val))){
 //取得成功
}
 
チェックボックス BOOL val = 値;
CheckDlgButton(hWnd, IDC_CHK_TEST, val);
値は、
BST_CHECKED
BST_INDETERMINATE
BST_UNCHECKED
BOOL val;
val = IsDlgButtonChecked(hWnd, IDC_CHK_TEST) == BST_CHECKED;
2007-10-31
ラジオボタン BOOL CheckRadioButton(
 HWND hWnd, //ダイアログボックスのハンドル
 int nIDFirstButton, //グループ内の最初のボタンの識別子
 int nIDLastButton, //グループ内の最後のボタンの識別子
 int nIDCheckButton //選択したいボタンの識別子
);
  2007-10-31

この辺りを自動的にやってくれるMFCのDDEは、やはり便利だなぁ。

他人のダイアログのコントロールIDを調べる方法


VC++ページへ戻る / 技術メモへ戻る
メールの送信先:ひしだま