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