● ToolBox API徒然草(2005/11/18)

  このニュースは、MOSAの会員にのみ配布されているデベロッパー向けの
  デジタルマガジンMOSADeNのに掲載された記事です。ほぼ一ヶ月遅れで
  ここに掲載されて行きます

 〜 画像ファイルをウィンドウに表示する(その3) 〜


今回は、openViwerWindow()で実行されているcreateMyWindow()ルーチンの解説が中心となります。ウィンドウ作成に必要な様々な情報をcreateMyWindow()に渡すことで、nibファイル経由でなくともウィンドウを作成することができます。

以下が、実際に画像表示用ウィンドウを作成しているcreateMyWindow()ルーチンです。



最初の引数はウィンドウタイトルで、ここには画像ファイルの名称が渡されます。続いてウィンドウの識別子としてOSTypeの'VIEW'を渡します。画像ウィンドウのWindowClassはドキュメントウィンドウです。WindowAttributesには、標準アトリビュートに、「ライブリサイズ利用」「スタンダードハンドラ利用」「コンポジティングモード利用」の3つのアトリビュートが追加されて渡されます。WindowClassとWindowAttributesの具体的な設定は、以下の通りです。

wcls=kDocumentWindowClass;
watt=kWindowStandardDocumentAttributes|kWindowLiveResizeAttribute|
kWindowStandardHandlerAttribute|kWindowCompositingAttribute;

次のRectには、imageFileToImage()で得た画像データの矩形枠が代入されます。これにより、ウィンドウ表示時の初期サイズ(幅と高さと位置)が決定されます。次のFSSpecには、表示するる画像ファイルの保存場所が渡されます。この情報は、タイトルバーに表示されるプロキシアイコンの作成に利用されます。そして、ウィンドウが問題なく作成されると、ルーチンは最後の引数にそのWindowRefを返してきます。

最初に実行されているsetupMyWindowBounds()ルーチンは、画像データの矩形枠から実際のウィンドウサイズを計算しています。ウィンドウの初期サイズをメインモニター内に収めるように調整し、複数ウィンドウをオープンした場合には、見やすくするために、その表示位置を前より少しずらします。今回は、一度のオープンで16ピクセルずらし、5度目のオープンで最初の位置に戻るように処理されています。こうして得られたウィンドウの初期サイズと表示位置は、SetWindowIdealUserState()に渡され、ズーム処理のディフォルト矩形枠(UserState)として利用されます。



次に呼ばれているsetupMyWindow()ルーチンでは、ウィンドウのプライベートな初期化を行います。nibファイルからメインウィンドウ(CatalogWindow)を作成する時にも説明しましたが、この処理では、ウィンドウに必要なプライベートなメモリ領域(WInfo構造体)をウィンドウのプロパティとして登録し、WindowRef経由でいつでも参照できるようにします。SetWindowProxyFSSpec()は、ウィンドウタイトルの左側にドキュメントのプロキシアイコンを表示します。実際のプロパティ登録では、WInfo構造体はシステム内部の格納場所に「複製」されますので、自分自身で確保しておいたポインタ(iptr)は不要となります。最後にDisposePtr()で解放することを忘れないでください。



WInfo構造体はsetWInfo()ルーチンでウィンドウ自体に添付します。この時に利用するのが、Window ManagerのSetWindowProperty() APIです。また、指定ウィンドウのWInfo構造体を得るのには、getWInfo()ルーチンを用います。こちらは、GetWindowProperty() APIを利用します。



最後に、WInfo構造体のw_prefに親ウィンドウのWindowRefを代入するsetWParent()ルーチンを紹介しておきます。画像表示ウィンドウでは、WInfo構造体のメンバーのうち、このw_prefしか利用しません。



次回は、setupViwerWindow()ルーチンとsetupViwerWindowEvent()ルーチンを解説したいと思います。この両ルーチンでの処理内容が、Mac OS Xのバージョンによって大きく変わることも紹介いたします。


copyright 2005 Ottimo, Inc. All rights reserved
無断転載・引用禁止
Contact us: koike@ottimo.co.jp