Mac OS XになりSheet Windowが使えるようになったおかげで、ダイアログの出番はめっきり減ってしまいました。しかし、古いアプリケーションをCarbon化する場合、ユーザインターフェースの大改造は開発負担を増やすので、今までのMovale Modal Dialogをそのまま利用したいこともあります。今回は、Nibファイルに定義したMovale Modal Dialogを、Carbon Eventに対応させてみます。
Interface Builderを使い「main.nib」というNibファイルを作成し、そこに「Dialog」というウィンドウオブジェクトを登録します。この時、Window Classは「Movale Modal」に、Theme Brushは「Dialog」と設定します。Attributesとしては「Standard Handler」のみをチェックしておきます。Nibファイルからダイアログを作成すののには、以下のcreateMyDialogWindow()ルーチンを使います。CreateNibReference()に渡すNibファイル名の拡張子「.nib」は省略してください。


実際にダイアログを表示するには、openMyDialogWindow()ルーチンを実行します。ShowWindow()の後にRunAppModalLoopForWindow()を実行すると、ダイアログ内だけのCarbon Event Loopに入ります。このループはRunApplicationEventLoop()で実行されるMain Event Loopとは別物です。Main Event Loopを親ループだとすれば、ダイアログ専用の子ループだと思えば良いでしょう。これにより、QuitAppModalLoopForWindow()を呼んでループから抜け出るまで、ユーザはダイアログ以外のウィンドウにはアクセスできなくなります。

ダイアログで「OK」「キャンセル」のどちらのボタンがクリックされたかは、ダイアログにインストールされたCarbon Event Handlerルーチンで判断します。押された方のボタンのcommandIDを、SetWRefCon()でウィンドウ自身にセットします。ループから抜けた時点でこの値を調べ、ユーザがどちらのボタンをクリックしたのか判断するわけです。

ボタン2つだけのダイアログでは寂しいので、Little Arrows(ID=10)とStatic Text(ID=20)コントロールも配置してあります。Little Arrowsは上下矢印の小さなボタンで、クリックすることでカウンタ値を増減することができます。今回は、カウンタ値をStatic Textの方に表示させます。こうしたリアルタイム処理は、コントロールのアクションルーチンとしてSetControlAction()で個別登録しておきます。

Little Arrowsは、コントロール内部にセットした値を自動で増減してくれるはずなのですが、何故だかMac OS X 10.2ではうまく動きません?以前はOKだったような気がしますが、現状が仕様なのかバグなのか未確認です。仕方がないので、今回は独自に値を増減させています。最大値と最小値(リミッタ)は、Interface Builderで設定した値が活かされます。増減後に一度SetControlValue()すれば、再度GetControlValue()で得た値は範囲内に収まっています。それを、setMyControlValue()でStatic Textに表示すれば、リアルタイムでカウンタ値を確認することができます。最後に、getMyControlRef()ルーチンとStatic Text Controlに数値を表示させるsetMyControlValue()ルーチンを紹介しておきます。

Nibファイルの取り扱いルーチンが定義されているUniversal InterfacesはIBCarbonRuntime.hです。Carbon Eventに関してはCarbonEvents.hを、コントロールに関しては、Controls.hとControlDefinitions.hを参照してください。ウィンドウやコントロールとCarbon Eventの関わりを詳しく調べたい方には「Handling Carbon Windows and Controls」というPDFドキュメントが参考になります。
http://developer.apple.com/techpubs/macosx/Carbon/HumanInterfaceToolbox/WindowManager/HandlingWindowsControls/index.html
copyright 2002 Ottimo, Inc. All rights reserved
無断転載・引用禁止
Contact us: koike@ottimo.co.jp