高度な検索
Developer Connection
Member Login ログイン | ご入会 ADC連絡先

Technote 1148

Dialog Manager Helper Functions


 

目次

はじめに

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月、提示したアイデアをよりよく整理するため、このテクニカルノートの内容は更新されました。