今回は主要なユーザーインターフェイス、ダイアログについてです 。まず、DLOGリソースをResEditで作って下さい。そうすると、ウインドウの中にウインドウが表示されます。(図1)上に並んだタイプの中からダイアログ向けの右から6番目を選んで、中に表示された方のウインドウをダブルクリックして下さい。そうすると新しいウインドウとフローティングウインドウが表示されます。(図2)ここでダイアログを編集します。ちなみに、これはDLOGリソースではなく、DITLリソースです。アラートのリソースを作る時にも出てきたものです。従って、DLOGとALRTのIDは重ならないようにしないといけません。右に表示されているツールをクリックして、左のウインドウにドラッグ&ドロップしてください。なお、必ず最初にBottun(右のウインドウの一番上の項目)を左のウインドウにドラッグ&ドロップしてください。そして、それをダブルクリックして下さい。すると細かな設定ができるウインドウが開きます(図3)Text:フィールドにはOKと入れてください。ちなみに、右下の四つのフィールドはボタンが表示されるRectのローカル座標です。キャンセルボタンが必要な場合はOKボタンの次に作って下さい。その他のアイテムについても同様にして、図4のようなダイアログを作って下さい。アイテムの右下をドラッグするとアイテムの大きさがかえられます。ちなみに、左上のアイコンはResource ID:1で、DITLメニューのShow Item Numbersをチェックしてあります。今回はこのサンプルについてのソースコードを紹介します。ちなみに、場所の設定もALRTリソースと同じ方法でできます。 |
図1
|
図2 |
|
図3 |
図4 |
DialogPtr d; Boolean dialogDone = false; short itemHit; Handle itemHandle; d = GetNewDialog(128, NULL, (WindowPtr)-1L ); //128はリソースID if (d == NULL) { SysBeep( 10 ); ExitToShell(); } SetDialogDefaultItem( d, 1 ); SetDialogCancelItem( d, 2 ); GetDialogItem( d, 6, NULL, &itemHandle;, NULL); SetControlValue( (ControlHandle)itemHandle, true ); SetPort( d ); ShowWindow( d ); while( ! dialogDone ) { ModalDialog( NULL, &itemHit; ); switch( itemHit ) { case 1: /*OKボタン*/ dialogDone = true; break; case 2: /*Cancelボタン*/ dialogDone = true; break; case 5: /*チェックボックス*/ GetDialogItem( d, 5, NULL, &itemHandle;, NULL); if( GetControlValue( (ControlHandle)itemHandle ) == false ) { SetControlValue( (ControlHandle)itemHandle, true ); } else { SetControlValue( (ControlHandle)itemHandle, false ); } break; case 6: /*ラジオボタン1*/ GetDialogItem( d, 6, NULL,&itemHandle;, NULL); SetControlValue( (ControlHandle)itemHandle, true ); GetDialogItem( d, 7, NULL, &itemHandle;, NULL); SetControlValue( (ControlHandle)itemHandle, false ); break; case 7: /*ラジオボタン2*/ GetDialogItem( d, 7, NULL, &itemHandle;, NULL); SetControlValue( (ControlHandle)itemHandle, true ); GetDialogItem( d, 6, NULL, &itemHandle;, NULL); SetControlValue( (ControlHandle)itemHandle, false ); break; } } DisposeDialog( d );
これでダイアログとしてのみかけ上の機能を果たすはずです。 まず、ダイアログを扱う型はDialogPtr型ですが、これは実はWindowPtrと上位互換です。いうなれば、プレステがWindowPtrだとすると、プレステ2がDialogPtrだというようなものです。SetDialogDefaultItemで枠で囲うアイテムを指定し(returnキーやenterキーにも反応する)SetDialogCancelItemでescキーに反応するボタンを指定しています。ModalDialogは何番のアイテムがクリックされたかを返してくれます。そして、OKかCancelが押されるまでループさせています。GetDialogItemでアイテムのハンドルを得て、SetControlValueで価を設定しています。チェックボックスはそのアイテムだけで良いのですが、ラジオボタンはそれぞれ排他的ではないといけないので、クリックされた側をONにして、クリックされた側でない側をOFFにしています。言い忘れましたが、caseの後の数字はDITL内でのアイテムの番号です。 ちなみに、Edit Textアイテムの処理は自動的にModalDialogが行ってくれます。編集メニュー(カット、コピー、ペースト、全てを選択)がショートカットまでアップルのガイドラインどおりに出来ていれば、それらの処理もModalDialogが行ってくれるはずです。 そして、見た目は出来たのですが、ダイアログに設定した価をDisposeDialogの前に取り出さないと意味がありません。チェックボックスやラジオボタンはGetControlValueで価を取り出します。Edit Textのテキストを取り出すには、GetDialogItemでアイテムのハンドルを取得し、GetDialogItemTextで取り出します。 テキストアイテムに設定されrている文字列をコピーして取り出す pascal void GetDialogItemText( Handle item, Str 255 text ); 引数 item テキストアイテムへのハンドル text 処理後、アイテムに設定されていた文字列がコピーされる。 ダイアログの処理の中枢、DialogManagerはWindowManager、TextEdit、QuickDraw、MenuManagerなど、多くのManagerの上に立っている、非常に高等な部分です。ダイアログの使い方はもっともっとあります。例えば、内部にポップアップメニューを搭載したり、DialogにSetPortして自分でQuickDrawなどの処理をして描画する事も可能です。また、他のウインドウやアプリケーションに移動する事もできないことはありません。(ModalDialogとは別の処理をする)しかし、基本はOKを押すと閉じる、それぞれのアイテムごとに処理をするという事です。 |