05092024

Last update2016/05/28 14:38

Back 現在地: Home パートナー segger-tools ダイアログ

ダイアログ


ダイアログ

ダイアログボックス(またはダイアログ)は、通常、ユーザからの入力を要求するために表示されるウィンドウです。それは様々な選択肢を介してユーザーから情報を要求し、複数のウィジェットを含んでもよい、またはそれは単に情報(ユーザへの注意や警告など)と、"OK"ボタンを提供するメッセージボックスの形態をとることができる。

ダイアログの基本

入力フォーカス

ウィンドウマネージャは、最後のタッチスクリーン、マウス、キーボード、または他の手段を持つユーザーによって選択されたウィンドウまたはウィンドウオブジェクトを記憶しています。このウィンドウは、キーボード入力のメッセージを受信し、入力フォーカスを持っていると言われています。
入力フォーカスを追跡するための主な理由は、キーボードコマンドの送信先を決定することです。入力フォーカスを持つウィンドウは、キーボードで生成されたイベントを受け取ります。

ダイアログをブロッキングと非ブロッキング

ダイアログウィンドウは、ブロッキングまたは非ブロッキングすることができます。ブロッキングダイアログのブロックの実行スレッド。これはデフォルトで入力フォーカスを持っており、スレッドを続行する前にユーザーによって閉じる必要があります。非ブロッキングダイアログでは、一方で、呼び出し元のスレッドをブロックしません-それは、それが表示されている間にタスクを続行することができます。
ダイアログがモーダルと呼ばれることがある他の環境では、ブロッキングとノンブロッキングことに注意してくださいと、モードレスそれぞれ。

ダイアログプロシージャ

ダイアログボックスはウィンドウであり、そしてそれは単に、システムの他のすべてのウィンドウのようなメッセージが何受け取ります。ほとんどのメッセージは、自動的にダイアログボックスのウィンドウのコールバックルーチンによって処理されるものと、ダイアログプロシージャとして知られているダイアログボックスの作成時に指定したコールバックルーチンに渡されます。

ダイアログのメッセージ

:ダイアログプロシージャに送信される追加メッセージの2種類がありますWM_INIT_DIALOGWM_NOTIFY_PARENTが WM_INIT_DIALOGのダイアログボックスが表示される前にメッセージが直ちにダイアログプロシージャに送信されます。ダイアログの手順は一般的にウィジェットを初期化し、ダイアログボックスの外観に影響を与える他の初期化タスクを実行するためにこのメッセージを使用してください。WM_NOTIFY_PARENT メッセージは、同期を確保するためにすべてのイベントの親に通知するためにその子ウィンドウがダイアログボックスに送信されます。子から送信されたイベントは、その型に依存し、ウィジェットのすべてのタイプごとに別々に記載されています。

ダイアログの作成

含まれるウィジェットを定義するリソーステーブル、およびウィジェットだけでなく、彼らの行動の初期値を定義するダイアログプロシージャ:二つの基本的なことは、ダイアログボックスを作成する必要があります。両方のアイテムが存在したら、唯一の単一の関数呼び出しが必要です(GUI_CreateDialogBox() またはGUI_ExecDialogBox()) 実際にダイアログを作成することを。

リソーステーブル

ダイアログボックスは、(GUI_ExecDialogBox()を使用して)または(GUI_CreateDialogBox()を使用して)非ブロッキングとしてブロックされた状態で作成される場合があります。リソーステーブルは、最初のダイアログに含まれるすべてのウィジェットを指定するかを定義する必要があります。以下に示す例では、リソーステーブルを作成します。それはまた、GUIビルダーによって行われる可能性がこの特定のサンプルは、手動で作成されました。

静的なconst GUI_WIDGET_CREATE_INFO _aDialogCreate [] = {{}"ダイアログ"、0、10、10、180、230、FRAMEWIN_CF_MOVEABLE、0、FRAMEWIN_CreateIndirect、{}、"OK"、GUI_ID_OK、100、5、60、20をBUTTON_CreateIndirect、{BUTTON_CreateIndirect 、"キャンセル"、GUI_ID_CANCEL、100、30、60、20}、{TEXT_CreateIndirect、"LTEXT"、0、10、55、48、15、TEXT_CF_LEFT}、{TEXT_CreateIndirect、"RText"、0、10、80、48 、15、TEXT_CF_RIGHT}、{、NULLをEDIT_CreateIndirect、GUI_ID_EDIT0、60、55、100、15、0、50}、{、、、、80、100、15、0、50 60 GUI_ID_EDIT1をNULLをEDIT_CreateIndirect}、{"、TEXT_CreateIndirect進"、0、10、100、48、15、TEXT_CF_RIGHT}は、{}、NULL、GUI_ID_EDIT2、60、100、100、15、0、6 EDIT_CreateIndirect、{、TEXT_CreateIndirect"ビン"、0、10、120、48 、15、TEXT_CF_RIGHT}、{、NULLをEDIT_CreateIndirect、GUI_ID_EDIT3、60、120、100、15}、{}、NULL、GUI_ID_LISTBOX0、10、10、48、40 LISTBOX_CreateIndirect、{、NULLをCHECKBOX_CreateIndirect、GUI_ID_CHECK0、10、140、0 、0}、{、NULL、GUI_ID_CHECK1、30、140、0、0をCHECKBOX_CreateIndirect}、{}、NULL、GUI_ID_SLIDER0、60、140、100、20 SLIDER_CreateIndirect、{、NULL、GUI_ID_SLIDER1、10、170、150、30 SLIDER_CreateIndirect ;}} 

ダイアログボックスに含まれる任意のウィジェットをして間接的に作成する必要がありますWID - GET_CreateIndirect 機能。"ウィンドウオブジェクト(ウィジェット)"。

ダイアログプロシージャ

上記のサンプルは以下のように空白のダイアログプロシージャを使用して作成されています。これは、任意のダイアログボックスプロシージャを作成する際の出発点として使用されるべき基本的なテンプレートです。

/************************************************* ******************** * *ダイアログプロシージャ* /静的ボイド_cbCallback(WM_MESSAGE * PMSG){スイッチ(PMSG -> MSGID){デフォルト:WM_DefaultProc(PMSG); }} 

このサンプルでは、ダイアログボックスは、次のコード行で表示されます。

GUI_ExecDialogBox(_aDialogCreate、GUI_COUNTOF(_aDialogCreate)、&_cbCallback、0、0、0);

表示されたダイアログボックスには、次のように見える、または類似の(実際の外観は、設定とデフォルト設定に依存します)

ダイアログボックスの作成後、リソーステーブルに含まれるすべてのウィジェットは、前のスクリーンショットに見られるようにもかかわらず、彼らは"空"が表示されます、表示されるようになります。ダイアログプロシージャは、まだ個々の要素を初期化するコードが含まれていないためです。ウィジェット、それによって引き起こされるアクション、およびそれらの間の相互作用の初期値は、ダイアログプロシージャ内で定義する必要があります。

ダイアログの初期化

典型的な次のステップは、それぞれの初期値を持つウィジェットを初期化することです。これは通常WM_INIT_DIALOGのメッセージに対する反応としてダイアログボックスプロシージャで行われます。以下のプログラムの抜粋は、物事を示しています。

/************************************************* ******************** * *ダイアログプロシージャ* /静的ボイド_cbCallback(WM_MESSAGE * PMSG){int型nCodeの、ID; WM_HWIN hEdit0、hEdit1、hEdit2、hEdit3、hListBox ; WM_HWIN hWin = PMSG -> hWin、スイッチ(PMSG -> MSGID){ケースWM_INIT_DIALOG:/ *ウィンドウのすべてのウィジェットハンドルを取得* / hEdit0 = WM_GetDialogItem(hWin、GUI_ID_EDIT0); hEdit1 = WM_GetDialogItem(hWin、GUI_ID_EDIT1); hEdit2 = WM_GetDialogItem(hWin、GUI_ID_EDIT2); hEdit3 = WM_GetDialogItem(hWin、GUI_ID_EDIT3); hListBox = WM_GetDialogItem(hWin、GUI_ID_LISTBOX0); / *全てのウィジェットを初期化* / EDIT_SetText(hEdit0、"EDITウィジェット0"); EDIT_SetText(hEdit1、"EDITウィジェット1"); EDIT_SetTextAlign(hEdit1、GUI_TA_LEFT); EDIT_SetHexMode(hEdit2、0x1234の、0、0xffff)の、EDIT_SetBinMode(hEdit3、0x1234の、0、0xffff)の、LISTBOX_SetText(hListBox、_apListBox); WM_DisableWindow(WM_GetDialogItem(hWin、GUI_ID_CHECK1)); CHECKBOX_Check(WM_GetDialogItem(hWin、GUI_ID_CHECK0)); CHECKBOX_Check(WM_GetDialogItem(hWin、GUI_ID_CHECK1)); SLIDER_SetWidth(WM_GetDialogItem(hWin、GUI_ID_SLIDER0)、5); SLIDER_SetValue(WM_GetDialogItem(hWin、GUI_ID_SLIDER1)、50);休憩;デフォルト:WM_DefaultProc( PMSG);)}

彼らの初期値を含むすべてのウィジェットで、次のように初期化されたダイアログボックスが表示されるようになりました。

ダイアログの挙動を定義する

ダイアログが初期化されると、すべてのことが残っているが、それらが完全に操作可能なこと、ウィジェットの振る舞いを定義するダイアログプロシージャにコードを追加することです。同じ例を続けると、最後のダイアログの手順を以下に示します。

/************************************************* ******************** * *ダイアログプロシージャ* /静的ボイド_cbCallback(WM_MESSAGE * PMSG){int型nCodeの、ID; WM_HWIN hEdit0、hEdit1、hEdit2、hEdit3、hListBox ; WM_HWIN hWin = PMSG -> hWin、スイッチ(PMSG -> MSGID){ケースWM_INIT_DIALOG:/ *ウィンドウのすべてのウィジェットハンドルを取得* / hEdit0 = WM_GetDialogItem(hWin、GUI_ID_EDIT0); hEdit1 = WM_GetDialogItem(hWin、GUI_ID_EDIT1); hEdit2 = WM_GetDialogItem(hWin、GUI_ID_EDIT2); hEdit3 = WM_GetDialogItem(hWin、GUI_ID_EDIT3); hListBox = WM_GetDialogItem(hWin、GUI_ID_LISTBOX0); / *全てのウィジェットを初期化* / EDIT_SetText(hEdit0、"EDITウィジェット0"); EDIT_SetText(hEdit1、"EDITウィジェット1"); EDIT_SetTextAlign(hEdit1、GUI_TA_LEFT); EDIT_SetHexMode(hEdit2、0x1234の、0、0xffff)の、EDIT_SetBinMode(hEdit3、0x1234の、0、0xffff)の、LISTBOX_SetText(hListBox、_apListBox); WM_DisableWindow(WM_GetDialogItem(hWin、GUI_ID_CHECK1)); CHECKBOX_Check(WM_GetDialogItem(hWin、GUI_ID_CHECK0)); CHECKBOX_Check(WM_GetDialogItem(hWin、GUI_ID_CHECK1)); SLIDER_SetWidth(WM_GetDialogItem(hWin、GUI_ID_SLIDER0)、5); SLIDER_SetValue(WM_GetDialogItem(hWin、GUI_ID_SLIDER1)、50);休憩;ケースWM_KEY:スイッチ(((WM_KEY_INFO *)(PMSG -> Data.p)) - >キー){ケースGUI_ID_ESCAPE:GUI_EndDialog(hWin、1);休憩;ケースGUI_ID_ENTER:GUI_EndDialog(hWin、0);休憩;}休憩;ケースWM_NOTIFY_PARENT: ID = WM_GetId(PMSG -> hWinSrc)、ウィジェットの/ * ID * / nCode社= PMSG -> Data.v; / *通知コード* /スイッチ(nCode社){ケースWM_NOTIFICATION_RELEASED:する* / ifをリリースした場合にのみ/ *の反応( ID == GUI_ID_OK){/ * OKボタン* / GUI_EndDialog(hWin、0);}場合(イド== GUI_ID_CANCEL){/ *キャンセルボタン* / GUI_EndDialog(hWin、1);}休憩; WM_NOTIFICATION_SEL_CHANGED場合:/ *セレクション変更* / FRAMEWIN_SetText(hWin、"ダイアログ - SELが変更");休憩;デフォルト:FRAMEWIN_SetText(hWin、"ダイアログ - 通知受信");}休憩;デフォルト:WM_DefaultProc(PMSG);}} 

APIリファレンス:ダイアログ

下の表は、それぞれのカテゴリ内でアルファベット順に利用可能なダイアログ関連のルーチンを示します。ルーチンの詳細な説明は次のセクションで見つけることができます。

ルーチン説明
ダイアログボックス
GUI_CreateDialogBox 非ブロッキングダイアログをGCREATE。
GUI_ExecCreatedDialog すでに作成されたダイアログを実行します。
GUI_ExecDialogBox ダイアログを作成して実行。
GUI_EndDialog ダイアログボックスを終了します。
メッセージボックス
GUI_MessageBox 作成し、メッセージボックスを実行します。
MESSAGEBOX_Create メッセージボックスを作成します。