タイトル【Carbon化シリーズ】スクロールバーをAppearance対応にカテゴリーCarbon/CF, Carbon化
作成日2000/4/29 11:50:26作成者新居雅行
Appearance対応のスクロールバーの大きな特徴は、スクロールバーのつまみのサイズが伸縮することだ。ただ、現状でも、昔ながらのつまみサイズが一定のアプリケーションも残っていて使えないわけではない。なんとかコンパイルを通すということも可能なのだが、ここは1つ、モダンなスクロールバーに代えることにした。
エラーが出たソースは、WindowSet.cだけで、これは、ウインドウ関連の関数をまとめているものである。この中に、新しく文書ウインドウを作るMakeDispWindowという関数がある。ここに、スクロールバーを生成するプログラムとして次のようなものがある。

VScrolH = NewControl(targetWindow, &ScrolRect, "\p", false, 0, 0,
              pageRect.right, scrollBarProc, 0);

この最後から2つ目の引数「scrollBarProc」の定数定義がなされていないというコンパイルエラーが出た。これはToolBoxの昔のスクロールバーのプロシージャ番号を本来は定数定義されているのであるが、ヘッダのControls.hからは消えてしまっている。実は、関連する定数はControlDefinitions.hに移動していて、それをインクルードすればscrollBarProcは使えるのであるが、ここはひとつAppearance Managerのスクロールバーを使うことにする。(なお、上記のステートメントの最後から3つ目の引数は、ソース的には違っているのだが、常に0が代入されているので、バイナリ的にはOKなのだ…)
AppearanceのスクロールバーのプロシージャはkControlScrollBarProcという定義定数で指定する。ただし、単にそれだけではだめで、Appearanceに対応した、コントロールへの値設定関数を呼び出して、初めて伸縮するつまみが出てくる。結果的に上記の部分を、以下のように変更した。

VScrolH = NewControl(targetWindow, &ScrolRect, "\p", false, 0, 0, 0,
         kControlScrollBarProc, 0)
SetControl32BitMinimum (VScrolH, pageRect.top);
SetControl32BitMaximum (VScrolH, pageRect.bottom
         - ( targetWindow->portRect.bottom
           - targetWindow->portRect.top));
SetControl32BitValue (VScrolH, targetWindow->portRect.top);
SetControlViewSize (VScrolH, targetWindow->portRect.bottom
                - targetWindow->portRect.top);

SetControlで始まる関数は、コントロールに値を与える。コントロールには最大値、最小値、現在の値の3つのパラメータがあったのだが、Appearanceに対応したコントロールの場合には、それぞれ「32Bit」という単語が入った名前の関数に置き換わる。さらに、つまみの大きさをSetControlViewSizeで設定する必要がある。上記のプログラムは、作成したウインドウがtargetWindow変数にあり、pageRectは編集領域を表すRect構造体となっている。なお、垂直のスクロールバーのプログラムを上記のように変更すると同様、水平のスクロールバーの作成部分も同じように変更する。
これらの新しい定義定数や関数を使うようにするためには、まず、ControlDefinisions.hをインクルードしなければならない。TextDrawのソースでは、Constants.hというヘッダにまとめてインクルードしているので、そこに記述を追加した。
さらに、ControlsLib(存在するフォルダは、CodeWarrior Pro 5→Metrowerks CodeWarrior→MacOS Support→Universal→Libraries→StubLibraries)を、プロジェクトに追加する必要がある。新しい関数の呼び出しライブラリで、これを含めておかないと、リンク時にエラーになる。
なお、TextDraw IIIのソースをコンパイルしたときには、kControlUpButtonPartという定義定数がないなどのエラーも出るが、これは、ContorlDefinitions.hをインクルードすれば、エラーは出なくなる。

こうして、Appearance対応のスクロールバーが出てくるが、スクロールバーの処理はウインドウの作成時以外にも行っている。しかしながら、スクロールしたときや、ウインドウのサイズを変更した時の処理は、一切変更しなくても、とりあえず少し使った限りではうまく動いている。これはなかなかすばらしい。例えば、ウインドウのサイズを変更した時に、SizeControl関数でスクロールバーのサイズを変えると、つまみの大きさも変更する必要があるのだが、その処理は自動的になされている。伸縮の度合いを見て、自動的に設定しているのだと思われる。スクロールした時などにスクロールバーの現在の値を設定する場合は、旧来の関数であるSetControlValueでも問題なく動いているようだ。とりあえずはこのまま行くことにする。

◇AppearanceのスクロールバーになったTextDraw
 figs/carbon/fig01.png
 figs/carbon/fig01.gif
(ソースプログラムについては、ある程度まとまった段階で、MDOnline講読者の方が利用できるようにする予定だ〜続く)
関連リンク