【事例演習1】 CGプログラム基礎 解 説 “Windowsプログラムにおける ダイアログボックスの作成方法”
メインフレームウインドウやダイアログボックスは, 必ずリソースIDとイベントメッセージを切り分けるハンドラ関数名をもつ IDC_OK IDC_NODE2 IDD_DIALOG3 DialogmModifyLinkProc(…) IDC_NODE1 IDC_TIME IDC_CANCEL IDC_NODE_X IDC_NODE_Z DialogAddNodeProc(…) IDD_DIALOG2 IDC_ADD_OK IDC_ADD_CANCEL DialogBox生成 DialogBox 生成 WM_COMMAND + IDC_ADDOK IDR_MENU MainWndProc(…) WM_COMMAND + IDC_OK WM_RBUTTONDOWN: ダイアログボックス3の 生成手順 ※右ボタンを押したらリンクの修正ダイアログを出したいとき WM_RBUTTONDOWN IDM_ADDNODE IDM_ADDNODE: ダイアログボックス2の 生成手順 メニュー“ノードの追加”を選択 WM_COMMAND + IDM_ADDNODE
ダイアログボックスの役割1<データの入力> Windowsだと・・・ MS-DOSだと・・・ DialogChangePointProc 出発ノード,到着ノードを入力して下さい > 1 7 Enter IDC_START_POINT IDC_END_POINT IDC_CHANGE_OK: Enterキーが押されたのをきっかけにして データの読み込み,数値を切り分けてから 各変数に格納する それぞれのフィールドのデータの読み込み, 各変数に格納する int startPoint,endPoint; char strn[10]; BOOL CALLBACK DialogChangePointProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_COMMAND: switch (LOWORD(wParam)) { case IDC_CHANGE_OK: GetDlgItemText(hWnd, IDC_START_POINT, strn, 10); scanf (strn,"%d",&startPoint); GetDlgItemText(hWnd, IDC_END_POINT, strn, 10); sscanf (strn,"%d",&endPoint); : “OK”ボタンが押されたのが きっかけ int startPoint,endPoint; printf(“出発ノード,到着ノードを入力して下さい ”); scanf ( "%d %d", &startPoint ,&endPoint );
ダイアログボックスの項目(Item)を文字列(Text)として 読み込む関数 読み込む関数 15 20 10文字分 1 5 文字列配列strn IDC_START_POINT GetDlgItemText (hWnd, IDC_START_POINT, strn, 10); startPoint int変数 scanf (strn, "%d", &startPoint);
ダイアログボックスの役割2<データの出力> Windowsだと・・・ MS-DOSだと・・・ DialogModifyLinkProc 始点ノード: 1 終端ノード: 7 12 IDC_MODIFY_NODE1 IDC_MODIFY_SHOW IDC_MODIFY_NODE2 int startPoint=1, endPoint=7; printf(“始点ノード: %d 終端ノー: %d ”, startPoint , endPoint ); int startPoint=1, endPoint=7; BOOL CALLBACK DialogModifyLinkProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_COMMAND: switch (LOWORD(wParam)) { case IDC_MODIFY_SHOW: SetDlgItemInt(hWnd, IDC_MODIFY_NODE1, startPoint, FALSE); SetDlgItemInt(hWnd, IDC_MODIFY_NODE2, endPoint, FALSE); return 1; : “ノード確認”ボタンが押された “ノード確認”ボタンが押されたのを きっかけに,各表示欄に表示する
ダイアログボックスの項目(Item)を整数(Int)として 書き込む関数 書き込む関数 15 startPoint int変数 IDC_MODIFY_NODE1 SetDlgItemInt(hWnd, IDC_MODIFY_NODE1, startPoint, FALSE);
ダイアログボックスを用いたときの イベントメッセージの流れ リソースエディタで作成 DialogProc1 アプリケーション イベントメッセージの流れ リソースエディタで作成 構成上の親子(owner)関係で 結ばれる ④ DialogBoxマクロを呼出し,動的に 1つのダイアログボックスを生成する. 同時にダイアログボックス用のイベントハンドラ関数と対応付ける ダイアログボックスのイベントハンドラ関数 DialogProc1 リソースID“IDD_DIALOG11” ハンドラ関数内の処理を実行 IDD_DIALOG11によって識別される DialogBoxのひな型(テンプレート) ⑤ 以後,生成されたダイアログボックス上での操作に関するイベントメッセージは親子関係をたどって送られる メインウィンドウ アプリケーション hInstance メインウィンドウのイベントハンドラ関数 MainWndProc ② メニュー選択操作等によるWM_COMMANDメッセージ ①表示されたダイアログボックスの リソース(例えば,ボタン)を押した とき, WM_COMMANDメッセージを送信 ③ WM_COMMANDメッセージのメッセージ名に対応した処理内容(ダイアログボックスを表示する)をもつハンドラ関数を起動する メッセージ名 メッセーシ名゙に対応して起動すべき処理内容 Windowsシステム