あまつぶ

2.24 【バッタ】

 先日、ぐるぐるの12巻を立ち読み。笑いをこらえるのに苦労した。バッタ、おもろすぎ。

 例によってPhutのCarbon対応についてのこと。
 しばらく使ってみると、昨日書いたいくつかの問題に続いてさらに不具合が見つかった。まず、パレットのタイトルバーのコマンド+クリックが効かないこと。パレットのファイルのパスがポップアップメニューとして表示されるはずだが、反応しない。もう一つ、パレットのアプリケーションを単にクリックした場合は問題ないが、なにかファイルをドロップした場合の処理がどうもおかしいようだ。ファイルが開かれないばかりか、場合によってはデバッガに落ちてしまう。それから、パレットのサイズを変更した時に内容が再描画されないという症状も見つかった。
 タイトルバーのコマンド+クリックとリサイズ時の再描画がされないことの原因は同じものだった。ウィンドウのポートサイズを調べるのに、GetWindowPortBounds(theWindow,nil);などとやってはいけないらしい。ちゃんと受け皿を用意しておかないと正常に動作してくれない。ま、考えてみればそういうもんかもしれないけど。同じような箇所が他にもあったので、それらもまとめて修正。
 昨日書いた、パレットがドラッグできない件は、DragWindow()を使うようにするだけであっさり解決した。指定したWDEFのIDかウィンドウの種類かで勝手にフローティングウィンドウだと判断してくれているようで、ウィンドウのハイライト処理なんかもなにも問題ないようだ。そういえば「MacWindows.h」に「Carbonではウィンドウのオーダリングが自動的に有効になるからInitFloatingWindows()を呼ぶ必要がない」というような記述があったが、これとも関係していそうな気がする。
 サスペンド時にウィンドウが隠されてしまう問題は、ウィンドウをCreateWindow()を使って作成してやれば解決……かと思ったが、そう簡単にはいかなかった。ウィンドウのアトリビュート(どう和訳するのがいいのかな)に「kWindowHideOnSuspendAttribute」というのがあってまさにこれを無効にしておけばいいのだろうと考えたのだが、よくよくヘッダファイルを読むと、「フローティングウィンドウでは自動的にこのフラグが設定される」とか。これについては、ウィンドウを作成した後にChangeWindowAttributes()で変更してやることによってめでたく解決した。
 ファイルをドロップした時に正常に動作しない件については、LaunchApplication()を呼ぶ際の引数のパラメータに問題があった。Carbon環境ではAEデスクリプタのdataHandleがハンドルでなくなったため、データを取り出すのにAEGetDescData()を使用しなければならないのだが、ここで指定するバイト数に誤りがあったのだ。このことは、「Processes.h」の「AppParameters」構造体の定義部分に書いてあった。messageLengthの後にそれで指定された長さのデータが続いている、と。最初からデータの長さを知ることはできないから、2回AEGetDescData()を呼ぶことでなんとか処理。実はAEGetDescDataSize()で全体のサイズを調べておけばいいのではないかという気もするが、ま、いいや(汗)。

 と、まあ、見つかった問題はすべて解決できたのだが、まだ不安もあるのでしばらくうちで動作テストをしてみる予定。MacOS Xでもちゃんと動くのかどうかはなぞだけど、どうなのかなぁ。
 そうだ。MacOS XでCarbonアプリケーションと認識されるためには'carb'リソースのID=0が必要らしいのだが、その内容についてドキュメントには「4バイトの0」と書いてあるのに対し、サンプルプログラムの方では「1バイトの0」が入っていた。どちらが正しいのかわからないが、とりあえず今はサンプルの方にあわせておく。
 もう一つ、Quitメニューについて。MacOS Xではアプリケーションメニュー(現在と同じものかどうかは知らないけど)に終了するためのメニューが追加されるのでファイルメニューには必要ないらしいのだ。そこで、Gestalt()でMacOS 8/9で動いているのかXで動いているのかを判別して使用するメニューを選ぶらしいのだが、ドキュメントに書いてある定義定数の「gestaltMenuMgrAquaLayoutBit」がどこにも見つからなかった。他に判別の方法があるのかも知れないが、とりあえずは今のままでいいか……。


February 23, 2000 ↑ February index → February 25, 2000