セレクタの内容は一つかあるいは要素1.要素2
のようにコンマで区切られたいくつかの要素です。すべての要素がTrue
のとき、その宣言部に示された方法でスクロールをします。
いくつかの要素は要素名(引数)
のように丸カッコでくくられた引数を必要とします。引数内に丸閉じカッコを書く必要がある場合、/)
のようにスラッシュをつけます。
要素名は大文字小文字を区別しません
このセレクタの形式は、セレクタだけでなく、宣言部でも、SendTo, HScrollBar, VScrollBar プロパティの値として使われます。
クラス名を識別する要素はClass(文字列)
というようにカッコでくくられた引数を必要とします。
ウィンドウの種類を識別するのに手っ取り早い方法が、クラス名の参照です。
クラス名が引数の文字列通りか。
クラス名に引数の文字列が含まれる(include)か
クラス名の左が引数の文字列か
クラス名の右が引数の文字列か
大文字小文字を無視(ignor case)し、それぞれ、Class, ClassInc, ClassLeft, ClassRight に対応します。
同じ性質のウィンドウクラスでも ScrollBar と TScrollBar など、似たような違った名前がついている事があります。このようなとき、ClassIncI(scrollbar)
とすると指定が楽です。
ウィンドウテキストを識別する要素はText(文字列)
というようにカッコでくくられた引数を必要とします。
いちばん親のウィンドウのウィンドウテキストは、タイトルバーの文字をあらわします。小さいテキストコントロールなどでは、テキストの内容を示している事がありますが、ほとんど使う事はないでしょう。Toplevel.TextInc(アプリケーションの名前)
といった指定をする事がほとんどだと思います。
それぞれ、クラス名を識別する要素のそれに対応します。
ウィンドウスタイルを識別する要素はStyle(文字列)
というようにカッコでくくられた引数を必要とします。
ウィンドウスタイルが、引数の文字列に示されるスタイルに含まれるか。
Styleの引数は スタイル1, スタイル2, スタイル3, ... ,スタイルn といった形をとり、スタイル1からスタイルnのうち、いずれかのスタイルを持っていればTrueとなります。
認識するスタイルは、以下の通りです
Style(WS_HSCROLLBAR, WS_VSCROLLBAR)
Style(WS_HSCROLLBAR).Style(WS_VSCROLLBAR)
この節中でよく出てくる GetScrollInfo というのは、スクロールについて、現在表示している位置(Pos)や、スクロールの上限と下限(Range)、表示している範囲(Page)を得るための、Windows標準の関数です。
GetScrollInfo で Pos が取得できるか
スクロールの Pos とは、スクロールによって現在表示している位置を表します。ポジションの略です。
スクロールのしかたの一つに、どこまでスクロールするか Pos値を直接指定する方法があります。ScrollPos が取得できても Pos値を直接指定できるとは限りませんが、取得できない場合は指定のしようがありません。
GetScrollInfo で Range が取得できるか
スクロールの Range とは、どこからどこまでスクロールできるかを表します。
Method プロパティで ScrollPos や ScrollLine でスクロールさせるようなとき、スクロールできる範囲を超えてスクロールしようとすると、スクロールが無効になるだけでなく、エラーが起きる可能性があります。
GetScrollInfo で Page が取得できるか
スクロールの Page とは、スクロールで表示できる範囲のうち、現在表示している範囲の大きさを表します。
Page が取得できると、Pageの値とウィンドウの大きさとから、あるドット数をスクロールさせるために、どれだけのスクロールをすればよいかが計算できます。
GetScrollInfo でスクロールバーコントロールの Pos が取得できるか
ScrollPos では、スクロールバーコントロールと標準スクロールバーのどれかであることを仮定して Pos が取得できるかを調べていますが、ScrollCtlPos ではスクロールバーコントロールのみ仮定して Pos を調べます。
それぞれ GetScrollInfo でスクロールバーコントロールの Range, Page が取得できるか
GetScrollInfo で水平(horizontal)標準スクロールバーの Pos が取得できるか
標準スクロールバーは一つのウィンドウに縦横二つのスクロールバーがある場合があり、縦横別々に取得します。
それぞれ GetScrollInfo で水平標準スクロールバーの Range, Page が取得できるか
それぞれ GetScrollInfo で垂直(vertical)標準スクロールバーの Pos, Range, Page が取得できるか
ウィンドウには親子関係があります。
最初は右ボタンが押されたときのウィンドウに注目して、そのウィンドウが該当するかどうかを調べますが、そのウィンドウだけでは十分に吟味できない場合も多いです。そこで、注目するウィンドウを親ウィンドウや子ウィンドウに移して、そのウィンドウが該当するかどうかさらに吟味します。
ここで、親ウィンドウの定義が曖昧と言うか、曖昧にしか分からなかったのですが、自分の親ウィンドウの子ウィンドウには当然自分が含まれるものと思うところですが、含まれない場合があります。この辺の動作は各要素の説明を読んでください。
該当する子ウィンドウを探す。
子ウィンドウは1つもないか、1つだけ有るか、複数有る場合があります。子ウィンドウがない場合はもはや該当しないものと判断します。子ウィンドウが複数ある場合は、全ての子ウィンドウに対して該当するかどうか調べ、偶然最初に該当した子ウィンドウを返します。
該当する子ウィンドウを、マウスカーソルの位置を含むものに制限して探す。
該当する子ウィンドウを、マウスカーソルの位置を含むものに制限して探し、複数ある場合は面積のなるべく小さい子ウィンドウを返す。
該当するウィンドウをそれぞれ左側, 上側, 右側, 下側の子ウィンドウに制限して探し、複数ある場合は一番それらしいものを返す。
該当する子孫ウィンドウを探す(ただし自分も含める)
直接の子ウィンドウだけでなく、子孫のウィンドウについて該当するかどうか調べます。このとき、まず自分自身も第一の子として調べます。自分を子とするのは不自然ですが、ウィンドウを特定する場合、この方が便利なのでこのような仕様にしています。
該当する子孫ウィンドウをそれぞれ ChildPointed, ChildSmall, ChildLeft, ChildTop, ChildRight, ChildBottom の方法で探す。
注目ウィンドウを親に移す
親ウィンドウがない場合は該当しないものと判断します。
親ウィンドウが自分自身を子ウィンドウとして含まない場合があります。
該当する祖先ウィンドウを探す(ただし自分も含める)
親ウィンドウがなくなるまで、順に親をさかのぼって該当するかどうか調べます。このとき、まず自分自身も第一の親として調べます。自分を親とするのは不自然ですが、この方が便利なのでこのような仕様にしています。
自分を子ウィンドウとして含まない親ウィンドウにまではさかのぼりません
注目ウィンドウをトップレベルウィンドウに移す(ただし自分である場合もある)
これ以上親を持たない、いちばんの親ウィンドウを返します。いちばんの親ウィンドウが自分自身である場合、自分を返します。
自分を子ウィンドウとして含まない親ウィンドウにまではさかのぼりません。
起動しているアプリケーションのトップレベルウィンドウから該当するものを探す(ただし自分である場合もある)
ポイントしたウィンドウとは別のアプリケーションのウィンドウをスクロールしたいときに使います。スクロールバーを持った仮想デスクトップソフトに便利かと思い実装しました。
注目ウィンドウをポイントされたウィンドウに戻す。
注目ウィンドウを SendToプロパティで指定されたウィンドウにする。
もし指定されたウィンドウがなければもはや該当しないものと判断します。
循環参照を防ぐため、この要素は SendToプロパティの値には使用できません。
注目ウィンドウを HScrollBar, VScrollBarプロパティで指定されたウィンドウにする。
もし指定されたウィンドウがなければもはや該当しないものと判断します。
循環参照を防ぐため、この要素は SendTo, ScrollBar, HScrollBar, VScrollBarプロパティの値には使用できません。
以下の要素は '.' を伴わず、単独で使われます。
スクロールデータ中のどのセレクタにも該当しない場合に適用されるルール。
Else が複数ある場合、最初の Else が有効になります。
スクロールデータ中の Default 以下の宣言部のデフォルト値を定義する。
Default がない場合、内部に持つデフォルト値が適用され、Default が複数有る場合、defaultが登場した時点で、それ以降のデフォルト値が変更されます。宣言部で定義していないプロパティは、以前のデフォルト値を引き継ぎます。
ありがちな設定を Default にしておく事によって、それ以降のセレクタの宣言部でプロパティをだいぶ省略できます。
名前付きルールを作成する。
この要素は Name(文字列)
というようにカッコでくくられた引数を必要とし、ここで指定された文字列は作成する名前付きルールの名前になります。
名前付きルールの宣言部の定義は、他の宣言部から Merge によって呼び出される時に使われます。何度も使う定義を名前付きルールにしておくと手間が省けます。
名前付きルールの性質上、デフォルト値は無視され、明示的に定義されたプロパティのみを保存します。