今回は前々回の続きです。実際に「Resorcerer」(リソース編集アプリケーション)を使い、ダイアログにいくつかのコントロールを配置する過程を解説します。ちなみに私の使用しているResorcererは、v2.2日本語版です。その前に少しだけ、11/11 〜11/12に開催された「MOSA湘南セミナー 2000」のご報告をしておきたいたいと思います。
MOSA湘南セミナー に参加されたみなさん、お疲れさまでした!Mac OS Xの登場が近いこともあり、Cocoa環境に関するセミナーなども開催されて、実に盛り上がった2日間でした。1日目はアップル社でApple側の技術担当者によるセミナーがありました。セミナー後にフィードバックの時間がありましたので、担当者にCarbon環境に関する幾つかの疑問を投げかけてみました。例えばCarbon Event Managerに関する詳しいドキュメントはいつ登場するのか?CarbonLib 1.1 SDKのGMは出る予定があるのか?Navigation Serviceのファイル名選択&入力ダイアログをシートダイアログとして表示する方法はあるのか?答えはどれも「???」でした。
「Carbon Event ManagerについてはUniversal Headerのコメント内容が一番詳しいので、それを参照して欲しい」といた具合で...(涙)。Carbonアプリケーションを開発しているデベロッパー側から見ると、あまりにも進展がない状態です。Mac OS X正式版の登場が来年始め(まあ延期されるかもしれませんが)に差し迫っている現状、開発環境の不確定な状況が続くのは実に困ったことです。ただし、今回のセミナーでMac OS Xパブリックβの「Developer Tools CD-ROM」(Interface BuilderやProject Builderを含む)に関する内容を、オープンな場所で議論してもOKという「許可」をAppleから得られたのは朗報でした。ただ、MOSAのメンバー内では「そんな事は当たり前だろ!」という意見が大勢を占めていましたのも事実ですが(笑)
さて、気分を一新してコントロールの話しに戻ることにします。さっそくResorcererを使い、コントロールを配置したダイアログを作成してみることにします。ダイアログ本体は後に回すとして、まずはコントロール用リソースを作成することから始めます。コントロールのリソースタイプは'CNTL'です。リソースメニューの「新規リソース」を選び、表示されたダイアログの登録タイプから'CNTL'を選択し(手入力も可)新規作成してください。

図1-Resorcererで'CNTL'リソースを新規作成する
ID番号128の'CNTL'リソースが一つ作成され、その編集用ダイアログがオープンされるはずです。

図2-'CNTL'リソースを編集するためのダイアログ
リソースのID番号は128以上なら好きな値を選ぶことができます。(128未満はAppleがリザーブしている)コントロールの種類は左上の「コントロールタイプ」Popupボタンから選択します。このボタンをクリックしてメニュー項目を表示してみると、Mac OS 8以降に数多くのコントロールが追加されたことが良く分かります。
ちなみに、Mac OS 8以降をターゲットにするアプリケーションでは、コントロールタイプの最初の方の項目「旧ボタン」や「旧スクロールバー」そして「Sys7 Popup」等は選択せず、「標準プッシュボタン」より下のコントロールタイプを使うようにしてください。コントロールタイプの選択で注意することは、Mac OS 9などの最新システムでは、この項目には無いコントロールタイプも存在するということです。(最新の英語版Resorcererでは利用できるタイプの項目が増えているかも...)こうしたコントロールは、Mac OS 8.5やMac OS 9.0で新たに追加されたタイプとなります。CarbonLib v1.04対応のアプリケーションでは、Mac OS 8.1環境でも最新のコントロールが利用できますので、Resorcererのタイプメニューでサポートされていないコントロールについても知っておくことが必要です。
こうしたコントロールは、最新の「Universal Headers 3.3.2」(ヘッダーファイル)に含まれている「ControlDefinitions.h」にすべて定義されています。例えば、インライン入力に対応した「編集テキスト」や自動トグル機能の「標準チェックボックス」などがこれに相当します。

図3-最新のコントロールタイプ(ProcID)を確認する
メニュー項目に無いコントロールの'CNTL'リソースを作りたい場合には、編集ダイアログの「ProcID」カラムに、ControlDefinitions.hに定義されている値を直接入力します。例えば、通常の「編集テキスト」はProcID=272なのですが、インライン用「編集テキスト」の場合はProcID=276となります。ちなみにメニューに定義されていない値を入力すると、Popupボタンの設定項目が「旧ボタン」となってしまいますが、気にする必要はありません。

図4-最新のコントロールタイプはProcIDを手入力する
ここで「標準プッシュボタン」を編集している状況と「Popupボタン(固定幅)」を編集している状況を比較してみます。

図5-標準プッシュボタンとPopupボタンの編集状況の比較
「Popupボタン(固定幅)」とは、ダイアログに配置したボタンが、設定した表示矩形枠にぴったり収まるタイプの物です。これに対して「Popupボタン(変動幅)」という種類もありますが、こちらは項目の文字列の長さによって表示サイズが変動するタイプの物です。「標準プッシュボタン」の右側にある「最初」「最小」「最大」というカラムは、「Popupボタン(固定幅)」では「Styleコード」「'Menu' ID」「タイトル幅」となっています。つまり、コントロール元来の「初期値」「最小値」「最大値」パラメータの意味合いが、多様な種類の登場により変化してしまったことが分かります。パラメータ入力カラムが数多く並び、なんだかスゴク複雑な編集をしているように見えますが、「ResEdit」の方で'CNTL'リソースの内容を見てみると、実は非常にシンプルであることが分かります。

図6-ResEditで表示した'CNTL'リソース編集ダイアログ
まず「Popupボタン(固定幅)」で設定する「Styleコード」「'MENU' ID」「タイトル幅」の3つのパラメータについて説明しておきます。「Styleコード」はボタンのタイトル表示部分のフォントスタイル(BoldとかItalic)を決定します。例えば、ここに256という値を代入すると、タイトルがBold(強調)表示になります。次の「'MENU' ID」にはPopupさせたいメニューの'MENU' リソースID番号を設定します。言うまでもなく、指定されたID番号の'MENU'リソースが用意されていないと、Popupボタンをクリックしても何も起こりません。Resorcererには、ダイアログメニューの「テスト・ラン...」により、実際のダイアログの挙動をシミュレーションする機能があります。この時に、入力した'MENU' リソースのID番号がResorcerer自身で使用しているID番号(例えばファイルメニューならID=129)と重なっていると、そっちを表示しようとするバグ(?)があるようです。ですから、コントロールで利用するメニューID番号は100番台を避けて、なるべく大きめな数値を使うことをお薦めします。
最後の「タイトル幅」にはPopupボタンのタイトル部分の表示幅をピクセル数で入力します。ここに「-1」を代入すると、Conatrol Managerがタイトル文字列の長さを調べて自動に表示幅を計算してくれます。コントロールをダイアログ上にどのようにレイアウトするかにより、こうした機能をうまく使い分けると便利かもしれません。Popupボタン同様、元来「初期値」「最小値」「最大値」を意味したパラメータが別目的になったり、あるパラメータに特定値を代入すると秘密の機能(笑)が使えるコントロールは少なくありません。よって、コントロールの使用方法をより深く極めたい人は、かならず一度はControlDefinitions.hのコメント内容を読んでみることが必要でしょう。Popupボタン以外のコントロールの各パラメータの「意味」については、次の機会に詳しく解説することにします。
続いて、こうして作成した'CNTL'リソースをダイアログに配置してみることにします。Resorcererでダイアログ用リソースを作成するのには、'CNTL'リソースの時と同じように'DLOG'リソースを新規作成します(同時に'DITL'リソースも作られる)。新規作成されたダイアログウィンドウをダブルクリックすれば、ダイアログ情報を編集できますので、ウィンドウタイプやウィンドウタイトルを好みの物に変更しておいてください。

図7-'DLOG'リソースの情報編集ダイアログを利用する
その後、アイテムメニューの「新規アイテム」からコントロールを選んで登録します。ダイアログにグレーの矩形枠が表示されますので、その部分をダブルクリックし、オープンしたダイアログで配置したい'CNTL'リソースのID番号を入力します。一度配置した'CNTL'リソースのその場での編集は、「編集」ボタンをクリックすることで可能です。

図8-'CNTL'リソースをダイアログアイテムとして登録する
「コントロール・アイテム」ダイアログを閉じれば、指定したコントロールがダイアログ上に表示されているはずです。好きな場所にマウスドラッグで移動してレイアウトを調整します。ダイアログに登録したアイテム(この場合はコントロール)は、その表示枠(境界)を自由に変更することができます。ちなみに、コントロール自身にも表示枠が定義されています。Resorcererの場合は、ダイアログアイテムの表示枠を変更すると、自動的にコントロール自身の表示枠もそれに一致させるような設定が可能です。ダイアログメニューの「設定...」で「'CNTL'の境界をコントロールアイテムの境界に合わせる」をチェックしておいてください。それと比較してResEditの場合には、そのサイズは'CNTL'リソースの矩形枠に保持されており、ダイアログアイテムの矩形枠の方は表示位置の原点にしか利用されませんので注意が必要です。
最後に、実際のアプリケーションで、こうして作成したダイアログを利用する時の注意点を上げておきます。コントロールやダイアログをAppearance Manager対応にするためには、ダイアログと同じID番号の'dlgx'リソースを作成します。Resorcererは同じスペルですが大文字の'DLGX'というリソースを自動作成します。しかし、これはResorcererが内部で利用しているテンポラリーリソースですので取り扱いを間違えないようにしましょう。'dlgx'リソースにはフラグが4つあり、そのうちの0,1,3の各ビットを「オン」にしておきます。

図9-'dlgx'リソースでオプションフラグをオンにする
ビット0(テーマ・バックグラウンド使用)をオンにすれば、ダイアログの背景描画がAppearance対応となり、CarbonアプリケーションとしてMac OS X上で起動すると、美しい背景(横縞模様)付きダイアログを表示することができます。また、「タブグループ」や「グループボックス」などのように、コントロール内にコントロールを埋め込む階層化を利用する場合には、ビット1(コントロール階層使用)をオンにしておく必要があります。これをオンにしておかないと、グループボックス内のコントロールが思った通りに表示されない場合がありますので、忘れないようにしてください。
またResorcererは、'CNTL'や'DLOG'リソースの編集を終わると、先ほどの'DLGX'リソース('dlgx'リソースではない)を含めて、ダイアログやコントロールのカラーテーブルを保持するための'cctb'、'dctb'、'ictb'といったリソースを自動的に作成します。'DLGX'リソースにかぎっては、ダイアログメニューの「設定...」で作成しないように設定できますが、その他のリソースの自動作成は止められません。こうしたカラーテーブルリソースは、Appearance対応にしたダイアログやコントロールではもはや必要ありません。逆に付加されていると、ダイアログ上のアイテムに妙な文字化けが発生する不具合が出ることがあります。編集が終了したら、自分で作成したリソースや'DITL'リソース以外は全部削除してしまった方が良いと思います。(私の経験上ですが...)
さて、次回はダイアログではなく一般的なドキュメントウィンドウにコントロールを配置する方法を解説したいと思います。また色々なタイプのコントロールについて、その特徴や使用上の注意もお話する予定です。
copyright 2000 Ottimo, Inc. All rights reserved
無断転載・引用禁止
Contact Us: koike@ottimo.co.jp