● ToolBox API徒然草(2005/12/27)

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

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


今回は、Mac OS X 10.3から導入された新機能を使うことで、前回紹介した3つのルーチンの処理内容がどの様に変化するのかを、順序を追って解説します。

今回の処理内容がMac OS X 10.3に対応していると言うことは、サンプルアプリケーションをMac OS X 10.4で起動しても問題はありません。しかし、当然ですが、Mac OS X 10.2では動作しませんので(クラッシュする)、サンプルのソースコードを今回の処理内容に切り替えたら、アプリケーション起動時にMac OS Xのバージョンをチェックして、対象外であればエラーを表示する必要があります。

処理内容のキーポイントは、Mac OS X 10.3から導入されたSetWindowResizeLimits()とHIViewSetLayoutInfo()の2つのAPIを利用することです。画像表示用ウィンドウに実装しているCarbon Event Handlerの処理がかなり複雑なのは、ウィンドウをリサイズした時の幅と高さを、画像の矩形枠内に制限する処理を行っているためです。ウィンドウの最大幅と高さを、SetControlMinimum()とSetControlMaximum()によりScrollView自身に記憶しておき(本来の目的とは異なる使い方ですが...)その値を、Event Handler側で読み込んで制限する処理に利用しています。

ウィンドウサイズの制限は、setupViwerWindowEvent()ルーチンでインストールされているEventTypeSpecの以下の2つのイベントを受け取る時に処理されています。

{ kEventClassWindow,kEventWindowGetMinimumSize },
{ kEventClassWindow,kEventWindowGetMaximumSize },

setupViwerWindow()ルーチンの最初に、SetWindowResizeLimits()を加えることで、これらのイベントに対する処理を省くことが可能となります。SetWindowResizeLimits()には、予想されるウィンドウの最大幅と高さをHISize構造体として渡します。

同様に、ウィンドウサイズを変更した時に、それに合わせてScrollViewのサイズを制限する処理もEvent Handlerを肥大化させている原因です。そちらは、以下の2つのイベントにを受け取る時に処理されています。この処理の方は、HIViewSetLayoutInfo()を使うことで省略することが可能です。

{ kEventClassWindow,kEventWindowBoundsChanging },
{ kEventClassWindow,kEventWindowBoundsChanged },

Mac OS X 10.3から、あるViewが、それが埋め込まれているViewに対して、どのような位置関係を保つのかを自動制御できるようになりました。今回のScrollViewはウィンドウのContentViewに埋め込まれていますので、その相対位置関係(レイアウト)を固定してしまいます。一度固定されたレイアウトは、ウィンドウがリサイズなどされてもシステム側で自動調整され保持されます。これをHIViewの自動レイアウト機能と呼びますが、そのレイアウト情報を指定するのがHIViewSetLayoutInfo()です。自動レイアウトを実現するのには、以下のHILayoutInfo構造体に適切な情報を記載してHIViewSetLayoutInfo()に渡します。



HILayoutInfo構造体はHIView.hに記載されています。この構造体のパラメータの意味やレイアウト情報の利用目的については、次回に詳しく解説したいと思います。以下に、SetWindowResizeLimits()とHIViewSetLayoutInfo()を加えた、Mac OS X 10.3用の新しいsetupViwerWindow()を紹介しておきます。



新APIの機能を使えるようになったおかげで、setupViwerWindowEvent()で用意しなければいけないEventTypeSpecは、7種類から3種類にまで減りました。また、画像ウィンドウ用のCarbon Event HandlerであるmyViwerWindowEventHandler()も、Mac OS X 10.3対応により大きく簡素化されました。



しかし、せっかくSetWindowResizeLimits()でウィンドウサイズの制限をシステム側に教えているのに、何故だかStandard Handlerのズーム処理(kEventWindowZoom)ではその制限が利いていません(どこまでも大きくなる)。Mac OS X 10.3の仕様なのかバグなのかは判断できませんが、とにかく納得いかない現象です。そのため、Mac OS X 10.3の段階では、ウィンドウの最大幅と高さをSetControlMinimum()とSetControlMaximum()で記憶する処理を、setupViwerWindow()ルーチンから外すことができませんでした。しかし、嬉しいことに、Mac OS X 10.4では、SetWindowResizeLimits()で設定したサイズ限界がズーム処理にも適応されるようになっています。

次回は「画像ファイルをウィンドウに表示する」の最終回です。HIViewSetLayoutInfo()に渡すHILayoutInfo構造体について詳しく解説し、Mac OS X 10.4で上記の3つのルーチンの処理内容がどう変化するのかを紹介します。


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