|
目次
はじめに
System 7 Dialog Manager
呼び出しインタフェース
呼び出しの使い方
結論
|
このテクニカルノートでは、ダイアログの管理を容易にするため
System 7.0 以降導入された Dialog Manager
呼び出しについて説明します。これを使用すると、System
のさまざまなサービスを呼び出して、マウスカーソルの追跡
(つまり、矢印カーソルと I
ビームカーソル相互の変更)、デフォルトを受け入れるための標準的なキー操作の処理、あるいはダイアログのキャンセルを行うことができます。
|
はじめに
System 7.0
のリリースとともに、標準ダイアログの機能を作成することがデベロッパにとってより容易になるように、いくつかの新しい
Dialog Manager 呼び出しが追加されました。
これらの呼び出しにより、次のような機能の作成が容易になりました。
- デフォルトボタンの設定 (return および enter
キーに対するエイリアスの作成とデフォルトボタンを囲む太線の描画)
- キャンセルボタンの設定 (esc キーと command-.
キーに対するエイリアスの作成)
- 矢印カーソルと I
ビームカーソルを相互に変更するためのカーソルの追跡
先頭ページに戻る
System 7
Dialog Manager 呼び出しインタフェース
新しい呼び出しは次の通りです。
/* These are copied from Universal Headers 3.1 */
EXTERN_API( Boolean )
StdFilterProc (DialogPtr theDialog,
EventRecord * event,
DialogItemIndex * itemHit);
EXTERN_API( OSErr )
GetStdFilterProc (ModalFilterUPP * theProc);
EXTERN_API( OSErr )
SetDialogDefaultItem (DialogPtr theDialog,
DialogItemIndex newItem);
EXTERN_API( OSErr )
SetDialogCancelItem (DialogPtr theDialog,
DialogItemIndex newItem);
EXTERN_API( OSErr )
SetDialogTracksCursor (DialogPtr theDialog,
Boolean tracks);
|
SetDialogDefaultItem はデフォルトボタン、つまり return
および enter
キーに応答するボタンを設定します。また、ボタンの周囲にデフォルトリング
(太線) を描画します。
SetDialogCancelItem
はキャンセルボタンを設定します。キャンセルボタンをデフォルトボタンとして設定することも可能です。キャンセルボタンは
esc キーおよび command-ピリオド
(あるいは結果的にピリオドのキーコードを生成する組み合わせ)
キーに応答します。
SetDialogTracksCursor
は、カーソルがテキスト編集フィールドの中に入ったときにその形状を矢印から
I ビームに変更するため
(あるいは、カーソルがテキスト編集フィールドの外に出たときにその形状を
I ビームから矢印に変更するため) 、カーソルの追跡を行うように
Dialog Manager に指示します。
GetStdFilterProc および StdFilterProc
呼び出しは協調して動作し、ダイアログを管理する作業の大部分を
Dialog Manager に任せることを可能にします。Dialog Manager
のデフォルトの動作が必要なときには必ず StdFilterProc
関数を呼び出します。
|
注意:
これらの呼び出しを適切に動作させるには、標準フィルタプロシージャを呼び出す必要があります。自動的なカーソルの追跡、デフォルトボタンを囲む太線の描画、および“OK”および“キャンセル”ボタンに対応するキー操作は、標準フィルタプロシージャを呼び出した場合のみアクティブになります。また、これらの呼び出しは
System 7 に固有のものであり、System 7
より前のシステムバージョンで使用することはできません。
|
先頭ページに戻る
呼び出しの使い方
これらの呼び出しを使用するためには、デベロッパの責任で若干の準備を行う必要があります。まず、目的のダイアログを作成した後で、どの項目をデフォルトおよびキャンセル項目にしたいかを
Dialog Manager
に指示する必要があります。キャンセル項目として選択したボタンは、esc
キーまたは Command-.
キーによって選択されるようになります。また、デフォルトとして指定したボタンは、return
または enter
キーによって選択されるようになり、そのボタンの周囲には標準的な太い境界線が描画されることになります。また、それぞれのボタンは適切なキーが押されたときにハイライト表示にされます。
SetDialogTracksCursorは、マウスカーソルがダイアログのどの部分にあるかにしたがって、Dialog
Manager
がアプリケーションに代わってカーソルを設定するように指示します。SetDialogTracksCursor
呼び出しに「true」値を渡すと、Dialog Manager
はダイアログ内でのカーソルの位置を常にチェックするようになり、カーソルが編集行の上に移動すると、カーソルの形状を
I
ビームに変更します。カーソルがその他の場所にあるとき、Dialog
Manager はカーソルの形状を標準的な矢印に設定します。
次のサンプルコードは、このテクニカルノートで説明した関数の呼び出し方法を具体的に示しています。
/* ModalDialog ループに入る前に若干の準備を行う */
ModalFilterUPP filterProcUPP;
myDialogPtr = GetNewDialog (kMyDialogID, nil, (WindowPtr)-1);
/* OK ボタンがデフォルトであることを Dialog Manager に指示する */
myErr = SetDialogDefaultItem (myDialogPtr, ok);
/* キャンセルボタンがキャンセル項目であることを Dialog Manager に指示する */
myErr = SetDialogCancelItem (myDialogPtr, cancel);
/* このダイアログには編集項目があるため、マウスカーソルが編集行の上にあるときに、
その形状を I ビームに変更することを Dialog Manager に指示する */
myErr = SetDialogTracksCursor (myDialogPtr, true);
filterProcUPP = NewModalFilterProc (ModalDialogFilter);
do {
ModalDialog (filterProcUPP, &hitItem);
switch (hitItem) {
case ...:
break;
case ...:
break;
default:
}
} while (hitItem != ok && hitItem != cancel);
DisposeRoutineDescriptor (filterProcUPP);
目的のモーダルダイアログフィルタは次のようになります。
Boolean ModalDialogFilter (DialogPtr theDialog,
EventRecord *theEvent, short *itemHit) {
Boolean result = false;
OSErr err = noErr;
ModalFilterUPP standardProc;
if ((theEvent->what == updateEvt) &&
(WindowPtr)theEvent->message != theDialog) {
err = DispatchWindowUpdate ((WindowPtr)theEvent->message);
} else if ((theEvent->what == activateEvt) &&
(WindowPtr)theEvent->message != theDialog) {
DoActivate (theEvent, true);
} else {
err = GetStdFilterProc (&standardProc);
if (err == noErr) {
result = CallModalFilterProc (standardProc, theDialog, theEvent, itemHit);
}
}
return result;
}
先頭ページに戻る
結論
これらの Dialog Manager 呼び出しを使用することで
(フィルタを使用していないときでも)、ダイアログにより一貫したユーザインタフェースを与えることができ、デベロッパ自身がすべての処理を自分で行うときに比べれば、かなりの作業時間を節約することができます。
先頭ページに戻る
参考文献
改訂の履歴
- 1991年10月、このテクニカルノートの初版が「Technote TB 37」として公開されました。
- 1991年と1999年にサンプルコードの追加と改訂が行われました。
- 1999年1月、提示したアイデアをよりよく整理するため、このテクニカルノートの内容は更新されました。
|