Q: QuickDraw に既知の有効なポートを指定することはできますか?
A: 多くの場合、カレントポートであるオブジェクト(GWorldPtr、 CGrafPtr など)は、破棄する必要があります。ただし、無効なカレントポートのまま QuickDraw を使用することはできないため、オブジェクトを破棄する前に、必ずカレントポートを既知の有効なポートに設定する必要があります。問題は、設定できる既知の有効なポートがない場合にどうするかです。
Carbon および Mac OS X 以前は、QuickDraw を有効な状態に残しておくために、(LMGetWMgrPort を通じて)カレントポートを Window Manager ポートに設定できるようになっていました。しかし Carbon では、Window Manager ポートは利用できなくなりました。さらに Mac OS X では、QuickDraw は保護されたメモリを使用するため、有効なポートの設定について要求が難しくなっています。
幸い、Mac OS X 10.1 では、QuickDraw に call SetPort( NULL ) という簡単な解決策が用意されています。Mac OS X 10.1 以降では、SetPort( NULL ) でカレントポートを「フォールバックポート」に設定でき、無効な参照解除を防ぐことができますが、不要な描画を防ぐために空の矩形領域ができることがあります。これは以前からの Window Manager の動作と非常によく似ています。Mac OS 8.5 以来(現在の Mac OS X でも)、Window Manager は、カレントポートを含んでいるウインドウを破壊すると必ず、自動的にポートをスクラッチポートに設定します。
Mac OS 9 では Carbon アプリケーションに対しても、SetPort( NULL ) のセマンティクス をサポートしていません。
[2003 年 9 月 29 日]
|