スクロール バーについて

ウィンドウには、ウィンドウのクライアント領域よりも大きいデータ オブジェクト (ドキュメントやビットマップなど) を表示できます。 スクロール バーを提供すると、ユーザーはクライアント領域のデータ オブジェクトをスクロールして、ウィンドウの境界線を越えて延びるオブジェクトの部分を表示できます。

スクロール バーは、クライアント領域のコンテンツがウィンドウの境界線を超えて拡張される任意のウィンドウに含める必要があります。 スクロール バーの向きによって、ユーザーがスクロール バーを操作するときにスクロールが行われる方向が決まります。 水平スクロール バーを使用すると、ユーザーはウィンドウの内容を左または右にスクロールできます。 垂直スクロール バーを使用すると、ユーザーはコンテンツを上下にスクロールできます。

このセクションでは、次のトピックについて説明します。

スクロール バーの一部

スクロール バーは、各端に矢印ボタンが付いた網掛け軸と、 矢印ボタンの間の スクロール ボックス (サムとも呼ばれる) で構成されます。 スクロール バーは、ウィンドウのクライアント領域内のデータ オブジェクトの全体の長さまたは幅を表します。スクロール ボックスは、クライアント領域に表示されるオブジェクトの部分を表します。 ユーザーがデータ オブジェクトをスクロールして別の部分を表示するたびに、スクロール ボックスの位置が変わります。 また、システムは、データ オブジェクト全体の現在の部分がウィンドウに表示されるように、スクロール バーのスクロール ボックスのサイズも調整します。 オブジェクトの大部分が表示されている場合、スクロール ボックスはスクロール バーシャフトの大部分を占めます。 同様に、オブジェクトのごく一部のみが表示されている場合、スクロール ボックスはスクロール バー シャフトの小さな部分を占めます。

ユーザーは、矢印ボタンの 1 つをクリックするか、網掛けされたスクロール バー シャフト内の領域をクリックするか、スクロール ボックスをドラッグして、ウィンドウの内容をスクロールします。 ユーザーが矢印ボタンをクリックすると、アプリケーションはコンテンツを 1 単位 (通常は 1 行または 1 列) スクロールします。 ユーザーが網掛けされた領域をクリックすると、アプリケーションはコンテンツを 1 つのウィンドウでスクロールします。 ユーザーがスクロール ボックスをドラッグしたときに発生するスクロールの量は、ユーザーがスクロール ボックスをドラッグする距離とスクロール バーのスクロール範囲によって異なります。 スクロール範囲の詳細については、 スクロール ボックスの位置とスクロール範囲を参照してください。

次のスクリーン ショットは、Windows Vista に表示される可能性があるため、垂直スクロール バーと水平スクロール バーを含む豊富な編集コントロールを示しています。 スクリーン ショットの撮影時にマウス ポインターがマウス ポインターを置いていたため、垂直スクロール バーは現在 "ホット" です。

screen shot of a rich edit control with scroll bars

標準のスクロール バーとスクロール バー コントロール

スクロール バーは、標準のスクロール バーまたはスクロール バー コントロールとしてウィンドウに含まれます。 標準のスクロール バーは、ウィンドウの非クライアント領域にあります。 ウィンドウと共に作成され、ウィンドウが表示されるときに表示されます。 標準のスクロール バーの唯一の目的は、ユーザーがクライアント領域のコンテンツ全体を表示するためのスクロール要求を生成できるようにすることです。 ウィンドウの作成時に WS_HSCROLLWS_VSCROLL、またはその両方のスタイルを指定することで、標準のスクロール バーをウィンドウに含めることができます。 WS_HSCROLL スタイルでは、クライアント領域の下部に水平スクロール バーが作成されます。 WS_VSCROLL スタイルでは、クライアント領域の右側に垂直スクロール バーが作成されます。 SM_CXHSCROLLとSM_CYHSCROLLのシステム メトリック値は、標準の水平スクロール バーの幅と高さを定義します。 SM_CXVSCROLLとSM_CYVSCROLLの値は、標準の垂直スクロール バーの幅と高さを定義します。 標準のスクロール バーは関連付けられたウィンドウの一部であるため、独自のウィンドウ ハンドルはありません。

スクロール バー コントロールは、SCROLLBAR ウィンドウ クラスに属するコントロール ウィンドウです。 スクロール バー コントロールが表示され、標準のスクロール バーのように機能しますが、別のウィンドウです。 別のウィンドウとして、スクロール バー コントロールは直接入力フォーカスを受け取ります。 標準のスクロール バーとは異なり、スクロール バー コントロールにはキーボード インターフェイスも組み込まれています。

1 つのウィンドウで必要な数のスクロール バー コントロールを使用できます。 スクロール バー コントロールを作成するときは、スクロール バーのサイズと位置を指定する必要があります。 ただし、スクロール バー コントロールのウィンドウのサイズを変更できる場合は、ウィンドウのサイズが変更されるたびにスクロール バーのサイズを調整する必要があります。

標準のスクロール バーを使用する利点は、システムがスクロール バーを作成し、そのサイズと位置を自動的に設定することです。 ただし、標準のスクロール バーは制限が厳しすぎる場合があります。 たとえば、クライアント領域をクアドラントに分割し、スクロール バーの個別のセットを使用して各クアドラントのコンテンツを制御するとします。 特定のウィンドウに対して一連のスクロール バーしか作成できないため、標準のスクロール バーを使用することはできません。 スクロール バー コントロールは、必要な数のウィンドウに追加できるため、代わりに使用します。

アプリケーションでは、ウィンドウの内容をスクロールする以外の目的でスクロール バー コントロールを提供できます。 たとえば、スクリーン セーバー アプリケーションには、画面上でグラフィックスが移動する速度を設定するためのスクロール バーが用意されている場合があります。

スクロール バー コントロールには、スクロール バーの向きと位置を制御するさまざまなスタイルを使用できます。 CreateWindowEx 関数を呼び出してスクロール バー コントロールを作成するときに必要なスタイルを指定します。 一部のスタイルでは、既定の幅または高さを使用するスクロール バー コントロールが作成されます。 ただし、スクロール バーの x 座標と y 座標、およびその他の寸法を常に指定する必要があります。

スクロール バー コントロール スタイル の表については、 スクロール バー コントロールのスタイルを参照してください。

Note

スクロールバーで視覚スタイルを使用するためには、アプリケーションにマニフェストを含め、プログラムの開始時に InitCommonControls 関数を呼び出す必要があります。 視覚スタイルの詳細については、 視覚スタイルを参照してください。 マニフェストの詳細については、 視覚スタイルを有効にするを参照してください。

 

スクロール ボックスの位置とスクロール範囲

スクロール ボックスの位置は整数で表されます。これは、スクロール バーが水平か垂直かに応じて、スクロール バーの左端または上端に対して相対的です。 この位置は、スクロール範囲の最小値と最大値の範囲内である必要があります。 たとえば、0 ~ 100 の範囲のスクロール バーでは、位置 50 は中央にあり、再メイン位置はスクロール バーに沿って均等に分散されます。 初期範囲はスクロール バーによって異なります。 標準スクロール バーの初期範囲は 0 ~ 100 です。コントロールの作成時に明示的な範囲を指定しない限り、スクロール バー コントロールの範囲は空です (最小値と最大値の両方が 0 です)。 範囲はいつでも変更できます。 SetScrollInfo 関数を使用して範囲の値を設定し、 GetScrollInfo 関数を使用して現在の範囲の値を取得できます。

通常、アプリケーションはスクロール範囲を便利な整数に調整するため、スクロール ボックスの位置をスクロールするデータ オブジェクトに対応する値に簡単に変換できます。 たとえば、一度に 16 行しか表示できないテキスト ファイルをウィンドウに 260 行表示する必要がある場合、垂直スクロール バーの範囲は 1 から 244 に設定できます。 スクロール ボックスの位置が 1 の場合、最初の行はウィンドウの上部になります。 スクロール ボックスの位置が 244 の場合、最後の行 (260 行目) はウィンドウの下部になります。 アプリケーションが最小値より小さいか、最大値を超える位置値を指定しようとすると、代わりに最小または最大スクロール範囲の値が使用されます。

スクロール バーのページ サイズを設定できます。 ページ サイズ は 、現在のサイズ に応じて、所有者ウィンドウのクライアント領域に収まるデータ単位の数を表します。 たとえば、クライアント領域に 16 行のテキストを保持できる場合、アプリケーションはページ サイズを 16 に設定します。 システムでは、スクロール ボックスのサイズを設定するために、スクロール範囲とスクロール バー シャフトの長さと共にページ サイズが使用されます。 スクロール バーを含むウィンドウのサイズが変更されるたびに、アプリケーションは SetScrollInfo 関数を呼び出してページ サイズを設定する必要があります。 アプリケーションは、送信 GetScrollInfo 関数を呼び出すことによって、現在のページ サイズを取得できます。

スクロール バーの範囲とデータ オブジェクトの間に便利な関係を確立するには、データ オブジェクトのサイズが変更されるたびに、アプリケーションで範囲を調整する必要があります。

ユーザーがスクロール バーのスクロール ボックスを移動すると、スクロール バーはスクロール ボックスの位置をスクロール範囲内の整数として報告します。 位置が最小値の場合、スクロール ボックスは垂直スクロール バーの上部または水平スクロール バーの左端にあります。 位置が最大値の場合、スクロール ボックスは垂直スクロール バーの下部または水平スクロール バーの右端にあります。

スクロール バーが報告できる最大値 (つまり、最大スクロール位置) は、ページ サイズによって異なります。 スクロール バーのページ サイズが 1 より大きい場合、最大スクロール位置は最大範囲の値より小さくなります。 次の数式を使用して、最大スクロール位置を計算できます。

MaxScrollPos = MaxRangeValue - (PageSize - 1) 

アプリケーションでは、スクロール バーのスクロール ボックスを移動する必要があります。 ユーザーはスクロール バーでスクロールを要求しますが、スクロール バーはスクロール ボックスの位置を自動的に更新しません。 代わりに、要求を親ウィンドウに渡します。この場合、データをスクロールし、スクロール ボックスの位置を更新する必要があります。 アプリケーションは SetScrollInfo 関数を使用してスクロール ボックスの位置を更新します。 それ以外の場合は、 SetScrollPos 関数を使用します。 スクロール ボックスの移動を制御するため、アプリケーションはスクロールするデータに最適な増分でスクロール ボックスを移動できます。

スクロールバーの表示

最小値と最大値が等しい場合は、標準スクロール バーが非表示になり、無効になります。 スクロール バーのスクロール範囲全体を含むページ サイズを指定すると、標準のスクロール バーも非表示になり、無効になります。 これは、クライアント領域のコンテンツに必要ない場合にスクロール バーを一時的に非表示にする方法です。 スクロール バーが非表示のときにスクロール要求を行う必要はありません。 システムによってスクロール バーが有効になり、最小値と最大値を等しくない値に設定したとき、およびページ サイズにスクロール範囲全体が含まれていない場合に、スクロール バーが再度表示されます。 ShowScrollBar 関数を使用して、スクロール バーを非表示または表示することもできます。 スクロール バーの範囲、ページ サイズ、またはスクロール ボックスの位置には影響しません。

EnableScrollBar 関数を使用すると、スクロール バーの一方または両方の矢印を無効にすることができます。 アプリケーションでは、無効になっている矢印が灰色で表示され、ユーザー入力に応答しません。

スクロール バー要求

ユーザーは、スクロール バーのさまざまな部分をクリックして、スクロール要求を行います。 システムは、 WM_HSCROLL または WM_VSCROLL メッセージの形式で、指定されたウィンドウに要求を送信します。 水平スクロール バーは WM_HSCROLL メッセージを送信し、垂直スクロール バーは WM_VSCROLL メッセージを送信します。 各メッセージには、ユーザーのアクション、スクロール バーへのハンドル (スクロール バー コントロールのみ)、場合によってはスクロール ボックスの位置に対応する要求コードが含まれます。

次の図は、スクロール バーのさまざまな部分をクリックしたときにユーザーが生成する要求コードを示しています。

diagram showing the request codes associated with each region on two scroll bars

SB_値は、ユーザーが実行するアクションを指定します。 アプリケーションは、 WM_HSCROLL および WM_VSCROLL メッセージに付随するコードを調べてから、適切なスクロール操作を実行します。 次の表では、値ごとにユーザーのアクションを指定し、その後にアプリケーションの応答を指定します。 いずれの場合も、データに適した単位がアプリケーションによって定義されます。 たとえば、テキストを垂直方向にスクロールする一般的な単位は、テキストの行です。

要求 アクション 回答
SB_LINEUP ユーザーが上部のスクロール矢印をクリックします。 スクロール ボックスの位置をデクリメントし、データの先頭に 1 単位ずつスクロールします。
SB_LINEDOWN ユーザーが下部スクロール矢印をクリックします。 スクロール ボックスの位置をインクリメントし、データの末尾に 1 単位ずつスクロールします。
SB_LINELEFT ユーザーが左スクロール矢印をクリックします。 スクロール ボックスの位置をデクリメントし、データの左端に 1 単位ずつスクロールします。
SB_LINERIGHT ユーザーが右スクロール矢印をクリックします。 スクロール ボックスの位置をインクリメントし、データの右端に 1 単位ずつスクロールします。
SB_PAGEUP ユーザーがスクロール ボックスの上にあるスクロール バー シャフトをクリックします。 スクロール ボックスの位置をウィンドウ内のデータ単位の数だけ減らします。は、同じ単位数だけデータの先頭に向かってスクロールします。
SB_PAGEDOWN ユーザーがスクロール ボックスの下にあるスクロール バー シャフトをクリックします。 スクロール ボックスの位置をウィンドウ内のデータ単位の数だけインクリメントし、同じ単位数だけデータの末尾に向かってスクロールします。
SB_PAGELEFT ユーザーがスクロール ボックスの左側にあるスクロール バー シャフトをクリックします。 スクロール ボックスの位置をウィンドウ内のデータ単位の数だけ減らし、同じ単位数だけデータの左端に向かってスクロールします。
SB_PAGERIGHT ユーザーがスクロール ボックスの右側にあるスクロール バー シャフトをクリックします。 スクロール ボックスの位置をウィンドウ内のデータ単位の数だけインクリメントし、同じ単位数だけデータの右端に向かってスクロールします。
SB_THUMBPOSITION ユーザーは、ドラッグした後にスクロール ボックスを離します。 スクロール ボックスをメッセージで指定された位置に設定します。は、スクロール ボックスが移動したのと同じ数の単位でデータをスクロールします。
SB_THUMBTRACK ユーザーがスクロール ボックスをドラッグします。 スクロール ボックスをメッセージで指定された位置に設定し、データをすばやく描画するアプリケーションに対してスクロール ボックスが移動したのと同じ数の単位でデータをスクロールします。 データをすばやく描画できないアプリケーションでは、スクロール ボックスを移動してデータをスクロールする前に、SB_THUMB (メガバイト)POSITION 要求コードを待機する必要があります。
SB_ENDSCROLL ユーザーは、矢印またはスクロール バー シャフトでマウスを押したままにした後、マウスを離します。 応答は必要ありません。

 

スクロール バーは、ユーザーがスクロール ボックスをクリックしてドラッグすると、SB_THUMBPOSITION および SB_THUMBTRACK 要求コードを生成します。 アプリケーションは、SB_THUMB (メガバイト)TRACK または SB_THUMB (メガバイト)POSITION 要求コードを処理するようにプログラムする必要があります。

SB_THUMBPOSITION 要求コードは、ユーザーがスクロール ボックスをクリックした後にマウス ボタンを離したときに発生します。 このメッセージを処理するアプリケーションは、ユーザーがスクロール ボックスを目的の位置にドラッグし、マウス ボタンを離した後、スクロール操作を実行します。

SB_THUMBTRACK 要求コードは、ユーザーがスクロール ボックスをドラッグしたときに発生します。 アプリケーションが SB_THUMBTRACK 要求コードを処理する場合、ユーザーがスクロール ボックスをドラッグすると、ウィンドウの内容をスクロールできます。 ただし、スクロール バーは短時間で多くのSB_THUMBTRACK 要求コードを生成できるため、アプリケーションでは、ウィンドウの内容をすばやく再描画できる場合にのみ、これらの要求コードを処理する必要があります。

スクロール バーのキーボード インターフェイス

スクロール バー コントロールには、ユーザーがキーボードを使用してスクロール要求を発行できるようにする組み込みのキーボード インターフェイスが用意されています。標準のスクロール バーは表示されません。 スクロール バー コントロールにキーボード フォーカスがある場合、ユーザーが方向キーを押すと、 WM_HSCROLL メッセージと WM_VSCROLL メッセージが親ウィンドウに送信されます。 要求コードは、ユーザーが押した方向キーに対応する各メッセージと共に送信されます。 方向キーとそれに対応する要求コードを次に示します。

方向キー コードの要求
DOWN SB_LINEDOWNまたはSB_LINERIGHT
End SB_BOTTOM
ホーム SB_TOP
左方向 (←) キー SB_LINEUPまたはSB_LINELEFT
PGDN SB_PAGEDOWNまたはSB_PAGERIGHT
PGUP SB_PAGEUPまたはSB_PAGELEFT
RIGHT SB_LINEDOWNまたはSB_LINERIGHT
UP SB_LINEUPまたはSB_LINELEFT

 

 

Note

スクロール バー コントロールのキーボード インターフェイスは、SB_TOPとSB_BOTTOM要求コードを送信します。 SB_TOP要求コードは、ユーザーがスクロール範囲の最上位の値に達したことを示します。 アプリケーションは、データ オブジェクトの上部が表示されるようにウィンドウの内容を下方向にスクロールします。 SB_BOTTOM要求コードは、ユーザーがスクロール範囲の一番下の値に達したことを示します。 アプリケーションは、SB_BOTTOM要求コードを処理する場合、データ オブジェクトの下部が表示されるようにウィンドウの内容を上方向にスクロールします。

 

標準のスクロール バーのキーボード インターフェイスが必要な場合は、ウィンドウ プロシージャで WM_KEYDOWN メッセージを処理し、メッセージに付随する仮想キー コードに基づいて適切なスクロール アクションを実行することで、自分で作成できます。 スクロール バーのキーボード インターフェイスを作成する方法については、 標準スクロール バーのキーボード インターフェイスの作成を参照してください。

クライアント領域のスクロール

クライアント領域の内容をスクロールする最も簡単な方法は、消去してから再描画することです。 これは、アプリケーションがSB_PAGEUP、SB_PAGEDOWN、およびSB_TOP要求コードと共に使用する可能性が高い方法です。通常、まったく新しいコンテンツが必要です。

SB_LINEUPやSB_LINEDOWNなどの一部の要求コードでは、スクロール後にいくつかの再メインが表示されるため、すべてのコンテンツを消去する必要はありません。 ScrollWindowEx 関数は、クライアント領域のコンテンツの一部を保持し、保持された部分を指定した量移動した後、新しい情報を描画するためにクライアント領域の残りの部分を準備します。 ScrollWindowExBitBlt 関数を使用して、データ オブジェクトの特定の部分をクライアント領域内の新しい場所に移動します。 クライアント領域の発見された部分 (保持されていない部分) は、次の WM_PAINT メッセージが発生したときに無効になり、消去され、描画されます。

ScrollWindowEx 関数を使用すると、スクロール操作からクライアント領域の一部を除外できます。 これにより、子ウィンドウなどの固定位置を持つ項目がクライアント領域内で移動し続けます。 新しい情報を受信するクライアント領域の部分が自動的に無効になるため、アプリケーションは独自のクリッピング領域を計算する必要はありません。 クリッピングの詳細については、 クリッピングを参照してください。

通常、アプリケーションは、スクロール バーで示される反対の方向にウィンドウの内容をスクロールします。 たとえば、ユーザーがスクロール ボックスの下の領域でスクロール バー シャフトをクリックすると、アプリケーションはウィンドウ内のオブジェクトを上にスクロールして、表示されている部分の下にあるオブジェクトの一部を表示します。

ScrollDC 関数を使用して四角形領域をスクロールすることもできます。

スクロール バーの色とメトリック

システム定義の色値 (COLOR_SCROLLBAR) は、スクロール バー シャフト内の色を制御します。 GetSysColor 関数を使用してスクロール バー シャフトの色を確認し、 SetSysColors 関数を使用してスクロール バー シャフトの色を設定します。 ただし、この色の変更はシステム内のすべてのスクロール バーに影響します。

GetSystemMetrics 関数を呼び出すと、標準のスクロール バーでシステムが使用するビットマップの寸法を取得できます。 スクロール バーに関連付けられているシステム メトリック値を次に示します。

システム計量 説明
SM_CXHSCROLL 水平スクロール バーの矢印ビットマップの幅
SM_CXHTHUMB 水平スクロール バーのスクロール ボックスの幅。 この値は、ページ サイズが 0 のスクロール バーの幅を取得します。
SM_CXVSCROLL 垂直スクロール バー上の矢印ビットマップの幅
SM_CYHSCROLL 水平スクロール バーの矢印ビットマップの高さ
SM_CYVSCROLL 垂直スクロール バー上の矢印ビットマップの高さ
SM_CYVTHUMB 垂直スクロール バーのスクロール ボックスの高さ。 この値は、ページ サイズが 0 のスクロール バーの高さを取得します。