タイトル【MacWIRE配信予定】小池邦人のプログラミング日記》2002/2/15 _ ウィンドウのグループ化 その1(1)カテゴリーユーザインタフェース, Carbon/CF, 小池邦人のプログラミング日記
作成日2002/2/15 15:58:18作成者新居雅行
   この記事のPDFファイル(738KB)は以下のアドレスにあります。
   ダウンロードには、MDOnlineのアカウントが必要です。
   pdfs/MDOnline020011.pdf
 ‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥
今回は、Mac OS X 10.1で利用できるようになったウィンドウのグループ化について解説します。この機能を利用すると、マウスドラッグにより複数のウィンドウを同時に移動させるようなことが可能となります。

今年のWWDC(Worldwide Developer Conference)は、5/6から5/10までアメリカのサンホセ市で開催される予定です。Apple社のサイトでは、まだ参加登録は始まっていないようですが、そろそろ開始されるのではないでしょうか? 今年のスケジュールでは、開始日がゴールデンウィークの終わりと重なっていますので、海外へ出るために国内移動をしなければならないデベロッパーにとっては、交通機関の予約などを早めにしておく必要があります。ところが、毎年アップル社がデベロッパーに斡旋する日本からのツアーは、スケジュールが決定するのが遅れがちでした。国内事情も考慮に入れて、今年は早めのスケジュール決定をお願いしたいと思います。

それでは、ウィンドウのグループ化についての話を始めます。Sheetウィンドウが降りている場合でも、その親ウィンドウのタイトルバーをドラッグすることで、両ウィンドウを同時に移動させることが出来ます。これは、両方のウィンドウが「グループ化」されており、ユーザの操作に対して行動を伴にするようにシステム側で管理されているからです。ここでは、Window Managerの「グループ化」APIを利用した「Group_Demo1」というサンプルアプリケーションを紹介いたします。アプリケーションを起動すると、「テキスト」「ポップアップ」「終了」という3つのボタンが配置されたウィンドウがオープンします。各ボタンコントロールに対応するコマンドIDは、先んじてInterface Builderで設定してあります。「テキスト」には‘text’ が、「ポップアップ」には‘popu’が、「終了」には‘quit’が割り付けられています。まずは、アプリケーションの機能を紹介することにしましょう。

 

「テキスト」ボタンをクリックすると、ピクチャ上にテキスト入力カラムがオープンし、そこでテキスト入力が可能となります。このテキスト入力カラムは最初からウィンドウに配置されているわけではありません。新たにオープンされた子ウィンドウのEditTextコントロールが使われます。その証拠に、カラムの回りにはウィンドウと同じ「影」が表示されていることが分かります。このテキスト入力用ウィンドウは、親ウィンドウにと同じグループに属しています。よって、親ウィンドウに対す移動や最小化などの操作は、ちゃんと子ウィンドウ側にも反映されます。
 

Microsoft社のExcelではセル上に影付きの入力カラムが表示されますが、そうした機能もこの仕組みを利用すれば可能となります。ここでのテキスト入力カラムは、もう一度「テキスト」ボタンをクリックすることで消える仕組みになっています。

「ポップアップ」ボタンをクリックすると、ピクチャの「一点」から、Dockの「ジニーエフェクト」のように別のウィンドウが湧き出してきます。下になったウィンドウは、新しいウィンドウが表示し終わった瞬間に隠れます。新しいウィンドウには「OK」ボタンがあり、それをクリックすると、今度は先程の一点に吸い込まれるように消えます。ウィンドウが吸い込まれた瞬間に、前のウィンドウが再表示されます。この機能はSheetウィンドウが、親ウィンドウの上辺から降りてくる特徴をうまく利用しています。親ウィンドウのサイズを限りなく小さく(縦横1ピクセル)にすれば、Sheetウィンドウは、あたかも1点から湧き出したような現れ方をするわけです。

 

それでは、サンプルアプリケーションのソースコードを見てみます。まずは、メニューバーとメインウィンドウ(MainWindow)をNibファイルから読み込みます。続いてsetUpWindowEvent()でCarbon Event Handlerルーチンをインストールしていますが、この仕組みについては前回の「Transfer_Demo」サンプルとまったく同じですので説明は省略します。

 

ウィンドウをあるグループに属するようにするには、先んじて登録すべきグループを作成しておく必要があります。これにはWindow ManagerのCreateWindowGroup()を用います。得られたWindowGroupRefを、登録したいウィンドウのWindowRefと一緒にSetWindowGroup()に渡せば、グループへの登録が完了します。WindowGroupRefは後から利用するので、外部変数のsys_groupに保存しておきます。この処理で重要なことは、CreateWindowGroup()で作成するグループの性質をアトリビュートフラグ(WindowGroupAttributes)で設定することです。今回のグループには「ウィンドウの移動」「選択された場合のアクティベート」「Dockへの引き込み」などの性質を共有させることにします。つまり、グループのどれかのウィンドウがDockに引き込まれれば、同時にすべてのウィンドウが引き込まれるわけです。アトリビュートフラグの種類や内容については、Universal Interfacesの「MacWindows.h」に定義されています。

 

グループの設定が終わったら、TransitionWindow()でウィンドウ(MainWindow)をオープンします。ユーザによりウィンドウ上のボタンがクリックされると、先んじてインストールされているCarbon Event Handlerルーチンが呼ばれます。

 

「テキスト」ボタンがクリックされるとhandlTextEdit()ルーチンが実行され、「ポップアップ」ボタンがクリックされるとhandlPopUp()ルーチンが実行されます。「OK 」ボタンはポップアップされるウィンドウの方にあります。このボタンをクリックするとHideSheetWindow()が実行され、子ウィンドウは親ウィンドウへ引き込まれます。その後、ShowWindow()を使い隠していたウィンドウを再表示するのですが、この時に必要となるWindowRefは、GetIndexedWindow()で得ています。これは、ウィンドウ番号とkWindowGroupContentsReturnWindowsを渡すことで、グループに属するウィンドウのWindowRefを得るためのAPIです。
(この項、続く)
関連リンク