タイトル【MacWIRE配信予定】小池邦人のプログラミング日記》2002/2/6<TransitionWindow()でウィンドウを移動させる>(1)カテゴリーユーザインタフェース, Carbon/CF, 小池邦人のプログラミング日記
作成日2002/2/6 15:18:10作成者新居雅行
   この記事のPDFファイル(847KB)は以下のアドレスにあります。
   ダウンロードには、MDOnlineのアカウントが必要です。
   pdfs/MDOnline020006.pdf
 ‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥
今回から、Mac OS X 10.1で利用できるようになったウィンドウに関係する新機能について解説します。最初は、Window Managerに属するTransitionWindow()というAPIを使ったサンプルアプリケーションを紹介します。

Mac OS X用のアプリケーションを開発していると、色々と理解に苦しむ現象に遭遇します(笑)。例えば、ドキュメントウィンドウとSheetウィンドウに、異なるタイプのTextEditコントロールを配置します。すると状況によって、テキスト入力で表示される文字の形状が変わります。

 

Sheetウィンドウ内のUnicode InputタイプとInline Inputタイプの違いは、Quartz 2DとQuickDrawのアンチエイリアス表示の違いでしょうが、ドキュメントウィンドウのInline Inputタイプで文字が太くなるのは何故でしょうか?基本的には、Unicode Inputタイプが一番奇麗な文字表示なのですが、このタイプのTextEditでは、イベントクラスが「kEventClassTextInput」で、イベント種類が「kEventTextInputUnicodeForKeyEvent」のCarbonイベントが来ません。Inline Inputタイプの方はちゃんと来るのですが...。こうした不都合は、Mac OS X 10.1が、まだまだ開発途上だという証拠ですね。Mac OS X 10.2での改善に期待したいと思います。

Mac OS 8/9でウィンドウを移動した時、先んじてその外枠だけが移動し、マウスを放した瞬間にウィンドウ本体の描画がなされます。しかし、Mac OS Xでは、ドラッグ中でもウィンドウの内容がリアルタイムに描画されます。移動時の表示は非常にスムーズで、ユーザに対する視覚的効果も良好です。Dockに登録されているウィンドウが拡大しながら飛び出す(スケールエフェクト)時や、ウィンドウのLive Risizeingでも同じ効果を提供しています。残念なら、Dockの「ジニーエフェクト」をCarbonアプリケーションで使うためのAPIは用意されていません。しかし、ShowWindow()、HideWindow()、MoveWindow()、SizeWindow()といった旧Window Manager APIの代わりにTransitionWindow()を使うことで、Mac OS Xライクの良好な視覚効果を得ることが出来ます。Mac OS X用のCarbonアプリケーションでは、旧APIをTransitionWindow()に差し換えておくことをお奨めします。

ここでは「Transfer_Demo」というアプリケーションを紹介します。このCarbonアプリケーションは、Develope ToolsのProject BuilderとInterface Builderで開発されています。Interface Builderで「MainWindow」「SheetWidnow」と名付けたふたつのウィンドウが作られ、main.nibというファイル名で保存されています。

 

両ウィンドウのImagWellコントロールに表示されているPICT画像は、リソースファイル(main.rsrc)として用意されています。

 

このリソースファイルもNibファイルと同様に、Project Builderのプロジェクトウィンドウのリストに加えておきます。

 

Project Builderに登録されているソースファイルはmain.cのみです。このプロジェクトをメイクしてアプリケーションを起動すると、Interface Builderで用意しておいたMainWindowの方がオープンします。そこまでの処理は、main.cソースファイルのmain()ルーチンに記述されています。

 

最初にNibファイルからメニューバーとメインウィンドウを呼び込みます。ウィンドウに配置されているボタンコントロールには、Carbonイベントで識別するために、Interface Builderにより固有のコマンドID(HI Command)が割り付けられています。次に、CreateWindowFromNib()で得たWindowRefをsetUpWindowEvent()に渡し、メインウィンドウにCarbon Event Handlerをインストールします。

 

InstallWindowEventHandler()で登録しているEventTypeSpecは2種類です。ひとつは、ボタンコントロールに割り付けたコマンドIDを認識するための物です。イベントクラスが「 kEventClassCommand」イベント種類が「kEventCommandProcess」のタイプです。もう片方は、ウィンドウのCloseボックスのクリックを認識するための物です。イベントクラスが「 kEventClassWindow」イベント種類が「kEventWindowClose」のタイプです。またユーザデータ(UserData)としてイベント対象であるウィンドウのWidnwRefが渡されています。

前準備が終了したら、ShowWindow()の代わりにTransitionWindow()を呼んでメインウィンドウを表示します。TransitionWindow()の最初の引数は、対象となるウィンドウのWindowRefです。2番目の引数にはどんなエフェクトを利用するのかを、3番目の引数にはどんなアクションに用いるかを設定します。利用可能なエフェクトとアクショについては、Universal Interfacesの「MacWindows.c」に定義されていますので参照してみてください。コメント文として処理内容が詳しく解説されています。

 

ウィンドウを表示する場合には、エフェクトにkWindowZoomTransitionEffectを、アクションにkWindowShowTransitionActionを選択します。最後の引数は、どの位置からズームを開始するのかを決定するための矩形情報(Rect)です。ここにNULLを代入しておけばディフォルト位置が選択されます。これでTransitionWindow()を実行すると、Mac OS 8/9のFinderと同じ視覚効果でウィンドウがオープンされます。グレイの矩形枠が徐々にポップアップして大きくなっていく感じです。ウィンドウを閉じる時にもTransitionWindow()を使いたれば、アクションにkWindowHideTransitionActionを選択します。残念ながら現状のMac OS X 10.1では、Dockの「ジニーエフェクト」ライクな視覚効果を得ることはできません。Mac OS Xの次期バージョンでは、このAPIの機能が拡張され、ジニーエフェクトと同じ視覚効果を得られることを望みたいと思います。
(この項、続く)
関連リンク