スクロールの概要

Classes: wxWindow, wxScrolledWindow, wxIcon, wxScrollBar.

スクロールバーは wxWidgets のあちこちに使われています。Window は垂直や水平のスクロールバーを持っており、表示させることができる機能が標準で備わっています。 しかし、実際にはスクロールバーを使わない Window もあります。例えば wxTextCtrl は single-line 状態であればスクロールバーを使用しません。

wxWindow を継承したクラスはスクロールバーを持っているので、スクロールバーを制御するための関数と、スクロールイベントを取得するためのイベントハンドラがあります。しかし、Window はスクロールイベントを発生させますが物理的にスクロールしてくれるわけではありません。ベースクラスである wxWindow には事実上、スクロールイベントを扱うデフォルトの機能はまったく、これっぽっちも備わっていないのです。 もしもスクロールバーを備えた wxWindow オブジェクトを作成してスクロールバーを操作してもまったく何も起きません。スクロールイベントでの解釈は Window のクラスによって異なるのでこのような慎重な実装になっています。

wxScrolledWindow (以前の wxCanvas)は実際に機能するスクロールバーを備えた Window の例です。スクロールは飛び飛びではなく、一定の単位で、Window の可視部によって起きるとして実装されています。 これは、ドローアプリケーション(※訳者注:お絵かきソフト等のこと)には適していますが、文字の大きさによってスクロール量が変化するような洗練されたテキストエディタには不向きです。そのような場合には wxWindow から継承し、自分でスクロールを実装するのがいいでしょう。wxGrid は自分でスクロールを実装しているクラスの例です。列(column)や行(row)は大きさがまちまちになる場合があるためです。

The scrollbar model

wxWindow::SetScrollbar 関数はスクロールバーをモデル化するための情報を与えます。この関数は以下の引数をとります:

orientation wxVERTICAL と wxHORIZONTAL のどちらか
position スクロール単位での位置
visible 可視部分のスクロール単位の数
range スクロール位置の最大値
refresh スクロールバーを書き換えるかどうか

orientation はこの関数の処理対象が横(horizontal)と縦(vertical)のどちらの内臓スクロールバーなのかを示します。

position は `thumb'(ドラッグしてスクロールさせる部分)(※訳者注:thumb というのはスクロールバーの‘つまみ’のことです。Microsoft Windows ではスクロールボックスと呼んでいます。) の位置です。 それはスクロール単位で与えてあり、スクロールバーの全範囲に正比例します。

visible は現在の Window の可視範囲をスクロール単位数で与えます。普通、スクロールバーは全体のサイズが変化のに伴い thumb の大きさも変化します。

range はスクロールバーの最大値です。最小値は0です。100行のテキストがあるならば100をセットするといいでしょう。 実際にスクロールするピクセル数では無いことに注意してください。どのようなコンテンツを表示するかでスクロール単位は変化します。

refresh すぐにスクロールバーを描きかえるかどうかを示します。

同一のフォントを使用して、50行のテキストを表示させるとします。Window はテキストを16行表示できる大きさとします。

あなたはこうするでしょう:

  SetScrollbar(wxVERTICAL, 0, 16, 50);

このとき thumb の位置が34(=50-16)よりも大きくなれないことに注意してください。

画面上に何行表示できるかは表示領域の大きさを文字の高さで割れば求めることができます。

スクロールバーの挙動を定義する場合、Window のサイズが変更されたときに表示領域のスクロール単位数を計算をしなおす必要があるでしょう。初期化時と wxSizeEvent ハンドラ関数で呼び出される AdjustScrollbars 関数で処理をすると良いでしょう。

ymasuda 平成17年11月19日