メッセージをモード付き表示する場合は、dtb_show_message() を使用します。このルーチンは、ユーザが押したメッセージ・ボックス・ボタンを示す値を返します。値は、次のように dtb_utils.h で定義される列挙型です。
/*
* Returns answer value for modal MessageBox
*/
typedef enum {
DTB_ANSWER_NONE,
DTB_ANSWER_ACTION1,
DTB_ANSWER_ACTION2,
DTB_ANSWER_ACTION3,
DTB_ANSWER_CANCEL,
DTB_ANSWER_HELP
} DTB_MODAL_ANSWER;
その後、戻り値 (たとえば switch 文経由) をテストし、コードの該当部分を実行できます。
次に、メッセージをモード付きで表示するコード例を挙げます。foo という名前の簡単なアプリケーションを作成したとします。プロジェクトは、foo.bip と名付けられ、1 つのモジュール (foo.bil) で構成されています。モジュール foo.bil は、メイン・ウィンドウ、コントロール区画、および 2 つのテキスト・フィールドで構成されています。2 つのテキスト・フィールドのうち、1 つはユーザの名前、もう 1 つは名字を入力するためのものです。ユーザが数字を入力した場合、エラー・メッセージが表示され、数字は入力できないことをユーザに通知し、2 つの選択肢を提示します。ユーザはやり直すか継続するかを選択します。やり直す場合は入力したテキストは消去され、継続する場合は入力されたテキストはそのまま残り、テキストを変更する方法についてはユーザに任されます。
関数呼び出し接続は、両方のテキスト・フィールドについて行われ、ユーザが何かを入力するたびに呼び出されます。最初のテキスト・フィールドの関数は、入力した文字が数字かどうかをチェックします。数字の場合は、エラー・メッセージをモード付きで表示します。
void
verify_first_nameCB(
Widget widget,
XtPointer clientData,
XtPointer callData
)
{
/*** DTB_USER_CODE_START vvv Add C variables and code below vvv ***/
char *text = (char *)NULL;
int textlen = 0;
DTB_MODAL_ANSWER answer = DTB_ANSWER_NONE;
DtbFooMainwindowInfo instance = (DtbFooMainwindowInfo) clientData;
/*** DTB_USER_CODE_END ^^^ Add C variables and code above ^^^ ***/
/*** DTB_USER_CODE_START vvv Add C code below vvv ***/
text = XmTextFieldGetString(widget);
if ((text != NULL) && (*text != NULL))
{
textlen = strlen(text);
if (isdigit(text[textlen-1]))
{
dtb_foo_message_initialize(&dtb_foo_message);
answer dtb_show_modal_message(instance->textfield,
&dtb_foo_message, NULL, NULL, NULL);
switch (answer)
{
case DTB_ANSWER_ACTION1: /* Start Over */
XmTextFieldSetString(widget, "");
break;
case DTB_ANSWER_ACTION2: /* Continue */
break;
}
}
}
/*** DTB_USER_CODE_END ^^^ Add C code above ^^^ ***/
}