トラックバー コントロールについて

トラックバーは、チャネル内のスライダー (サムとも呼ばれる) とオプションの目盛りを含むウィンドウです。 ユーザーがマウスまたは方向キーを使用してスライダーを動かすと、トラックバーから変更を示す通知メッセージが送信されます。

トラックバーは、ユーザーが非連続の符号なし整数値または範囲内の連続する符号なし整数値一式を選択できるようにする場合に便利です。 たとえば、トラックバーを使用して、ユーザーがスライダーを特定の目盛りに移動することで、キーボードのリピート率を設定できるようにすることができます。 一般的なトラックバーを以下の図に示します。

screen shot of a trackbar with labels at the ends for slow and fast

トラックバーのスライダーは、作成時に指定した増分で移動します。 この範囲の値は論理単位と呼ばれます。 たとえば、トラックバーに 0 から 5 の範囲の論理単位を指定する場合、スライダーは、6 つの位置 (トラックバーの左側にある位置と、範囲内の増分ごとに 1 つの位置) のみを占めることができます。 通常、これらの各位置は目盛りによって識別されます。ただし、目盛りの数は任意であり、論理位置の数よりも少ない場合があります。

トラックバーを作成するには、CreateWindowEx 関数を使用して、TRACKBAR_CLASS ウィンドウ クラスを指定します。 トラックバーを作成したら、トラックバー メッセージを使用して、そのプロパティの多くを設定および取得できます。 加えることができる変更には、スライダーの最小位置と最大位置の設定、目盛りの描画、選択範囲の設定、およびスライダーの位置変更が含まれます。

選択範囲

TBS_ENABLESELRANGE スタイルのトラックバーを作成する場合は、選択範囲を指定できます。 次の図に示すように、トラックバーは選択範囲を強調表示し、始点と終点に三角形の目盛りを表示します。

screen shot of a trackbar with a range highlighted

トラックバーの選択範囲は、その機能に影響を与えません。 範囲を実装するのはアプリケーション次第です。 これは、次の方法のいずれかで実行できます。

  • 選択範囲を使用して、ユーザーがパラメーターの最大値と最小値を設定できるようにします。 たとえば、ユーザーはスライダーをある位置に移動し、[最大] というラベルのボタンをクリックできます。 次に、ユーザーが選択した値を表示するように選択範囲を設定します。
  • スライダーの動きをコントロール内の所定のサブ範囲に制限し、WM_HSCROLL または WM_VSCROLL 通知を処理し、選択範囲外の移動を禁止します。 たとえば、ユーザーが行ったその他の選択のために、または使用可能なリソースに応じて、ユーザーが使用できる値の範囲を変更できる場合などです。

トラックバー メッセージ

トラックバーの論理単位は、トラックバーが表すことができる連続した値一式です。 通常、トラックバーが作成されるとすぐに、TBM_SETRANGE メッセージを使用して、可能な値の範囲を指定することで定義されます。 アプリケーションは、TBM_SETRANGETBM_SETRANGEMAX または TBM_SETRANGEMIN を範囲を動的に変更できます。

スライダーの位置 (つまり、ユーザーが選択した値) を取得するには、TBM_GETPOS メッセージを使用します。 スライダーの位置を設定するには、TBM_SETPOS メッセージを使用します。

TBS_NOTICKS スタイルを指定しない限り、トラックバーの先頭と末尾に目盛りが自動的に表示されます。 (Microsoft Visual Studio リソース エディターでは、Tick Marks プロパティを False に設定することを意味します)。TBS_AUTOTICKS スタイルを使用すると、トラックバーに沿って定期的に追加の目盛りを自動的に表示できます。 既定では、TBS_AUTOTICKS トラックバーには、トラックバーの範囲の増分ごとに目盛りが表示されます。 自動目盛に別の間隔を指定するには、TBM_SETTICFREQ メッセージをトラックバーに送信します。 例えば、このメッセージを使用して、1 から 100 の範囲で 10 個の目盛りのみを表示することができます。

1 つの目盛りの位置を設定するには、TBM_SETTIC メッセージを送信します。 トラックバーが各メモリの位置を保存する DWORD 値の配列を維持します。 配列には、トラックバーが自動作成する最初と最後の目盛りは含まれません。 TBM_GETTIC メッセージを送信して対応するメモリの位置を取得する際は、この配列のインデックスを指定します。 または、TBM_GETPTICS メッセージを送信すると、配列へのポインターを取得することもできます。 配列内の要素の数は、TBM_GETNUMTICS メッセージによって返されるメモリ数より 2 つ少なくなります。 これは、TBM_GETNUMTICS によって返されるカウントには、配列に含まれていない最初と最後の目盛りが含まれているためです。 目盛りの物理的な位置を取得するには、トラックバーのウィンドウのクライアント座標で、TBM_GETTICPOS メッセージを送信します。 TBM_CLEARTICS メッセージは、トラックバーの目盛りの最初と最後を除くすべてを削除します。

トラックバーの線のサイズは、右方向キーや下方向キーなどの方向キーからのキーボード入力に応じてスライダーが移動する距離を決定します。 行サイズを取得または設定するには、TBM_GETLINESIZE および TBM_SETLINESIZE メッセージを送信します。 また、ユーザーが方向キーを押すと、TB_LINEUP と TB_LINEDOWN 通知コードが親ウィンドウに送信されます。

トラックバーのページ サイズは、キーボード入力 (PAGE UP キーや PAGE DOWN キーなど) やマウス入力 (トラックバー チャネルでのクリックなど) に応じてスライダーが移動する距離を決定します。 ページ サイズを取得または設定するには、TBM_GETPAGESIZE および TBM_SETPAGESIZE メッセージを送信します。 また、トラックバーは、ページをスクロールするキーボードまたはマウス入力を受信すると、TB_PAGEUP および TB_PAGEDOWN 通知コードを親ウィンドウに送信します。 詳細については、「トラックバー通知メッセージ」を参照してください。

アプリケーションは、メッセージを送信すると、トラックバーの寸法を取得できます。 TBM_GETTHUMBRECT メッセージは、スライダーの外接矩形を取得します。 TBM_GETTHUMBLENGTH メッセージは、スライダーの長さを取得します。 TBM_GETCHANNELRECT メッセージはトラックバーのチャンネルの外接矩形を主直視ます。これは、スライダーが移動する領域です。 範囲が選択されている場合の強調表示が含まれます。 トラックバーに TBS_FIXEDLENGTH スタイルがある場合、TBM_SETTHUMBLENGTH メッセージを送信して、スライダーの長さを変更します。

トラックバーにメッセージを送信して、選択範囲を取得または設定します。 TBM_SETSEL メッセージを使用して、選択範囲の開始位置と終了位置を設定します。 選択範囲の開始位置または終了位置のみを設定するには、TBM_SETSELSTART または TBM_SETSELEND メッセージを送信します。 選択範囲の開始位置または終了位置を取得するには、TBM_GETSELSTART または TBM_GETSELEND メッセージを送信します。 選択範囲をクリアし、トラックバーを元の範囲に戻すには、TBM_CLEARSEL メッセージを送信します。

Note

アプリケーションは、ユーザーが選択範囲外の値を選択できないようにします。 コントロール自体は、ユーザーがスライダーを範囲外に移動することを妨げるものではありません。

 

トラックバー通知メッセージ

トラックバーは、親に WM_HSCROLL または WM_VSCROLL メッセージを送信してユーザーのアクションを親ウィンドウに通知します。 TBS_HORZ スタイルのトラックバーは、WM_HSCROLL メッセージを送信します。 TBS_VERT スタイルのトラックバーは、WM_VSCROLL メッセージを送信します。 WM_HSCROLL または WM_VSCROLLwParam パラメーターの下位ワードには、通知コードが含まれます。 TB_THUMBPOSITION および TB_THUMBTRACK コードの場合、wParam パラメーターの上位ワードがスライダーの位置を指定します。 他のすべての通知コードでは、上位ワードは 0 です。スライダーの位置を決定するには、TBM_GETPOS メッセージを送信します。 lParam パラメーターは、トラックバーへのハンドルです。

システムは、ユーザーがキーボードを使用してトラックバーを操作した場合にのみ、TB_BOTTOM、TB_LINEDOWN、TB_LINEUP および TB_TOP 通知コードを送信します。 TB_THUMBPOSITION および TB_THUMBTRACK 通知コードは、ユーザーがマウスを使用しているときにのみ送信されます。 どちらの場合も、TB_ENDTRACK、TB_PAGEDOWN、および TB_PAGEUP 通知コードが送信されます。 次の表は、トラックバー通知コードと Virtual-Key Codes 通知が送信される原因となるイベント (仮想キー コードまたはマウス イベント) を一覧しています。

通知コード 送信される理由
TB_BOTTOM VK_END
TB_ENDTRACK WM_KEYUP (ユーザーは、関連する仮想キー コードを送信したキーを放した場合)
TB_LINEDOWN VK_RIGHT または VK_DOWN
TB_LINEUP VK_LEFT または VK_UP
TB_PAGEDOWN VK_NEXT (ユーザーがスライダーの下または右にあるチャネルをクリックした場合)
TB_PAGEUP VK_PRIOR (ユーザーがスライダーの上または左にあるチャネルをクリックした場合)
TB_THUMBPOSITION TB_THUMBTRACK 通知コードに続く WM_LBUTTONUP
TB_THUMBTRACK スライダーの移動 (ユーザーがスライダーをドラッグしました)
TB_TOP VK_HOME

 

既定のトラックバー メッセージ処理

このセクションでは、トラックバーによって実行されるウィンドウ メッセージ処理について説明します。

メッセージ 処理の実行
WM_CAPTURECHANGED WM_LBUTTONDOWN 処理中に設定されたタイマーを強制終了し、必要に応じて、TB_THUMBPOSITION 通知コードを送信します。 TB_ENDTRACK 通知コードを常に送信します。
WM_CREATE 行サイズ、ページ サイズ、目盛りの頻度を既定値に設定するなど、追加の初期化を実行します。
WM_DESTROY リソースを解放します。
WM_ENABLE トラックバー ウィンドウを再描画します。
WM_ERASEBKGND トラッカーバーの現在の背景色を使用して、ウィンドウの背景を消去します。
WM_GETDLGCODE DLGC_WANTARROWS 値を返します。
WM_KEYDOWN 方向キーを処理し、必要に応じて、TB_TOP、TB_BOTTOM、TB_PAGEUP、TB_PAGEDOWN、TB_LINEUP および TB_LINEDOWN 通知コードを送信します。
WM_KEYUP キーが方向キーの 1 つである場合は、TB_ENDTRACK 通知コードを送信します。
WM_KILLFOCUS トラックバー ウィンドウを再描画します。
WM_LBUTTONDOWN フォーカスとマウス キャプチャをトラックバーに設定します。 必要に応じて、ユーザーがウィンドウ内のマウス ボタンを押したままにしたときに、スライダーがマウス カーソルに向かって移動する速度を決定するタイマーを設定します。
WM_LBUTTONUP WM_LBUTTONDOWN 処理中にタイマーが設定されている場合は、マウス キャプチャを解放し、タイマーを終了します。 必要に応じて、TB_THUMBPOSITION 通知コードを送信します。 TB_ENDTRACK 通知コードを常に送信します。
WM_MOUSEMOVE スライダーを移動し、マウスを追跡するときに TB_THUMBTRACK 通知コードを送信します (WM_TIMER を参照)。
WM_PAINT トラックバーをペイントします。 wParam パラメーターが NULL 以外の場合、コントロールは値が HDC であることを前提とし、そのデバイス コンテキストを使用して描画します。
WM_SETFOCUS トラックバー ウィンドウを再描画します。
WM_SIZE トラックバーの寸法を設定し、表示する十分なスペースがない場合はスライダーを削除します。
WM_TIMER マウスの位置を取得し、スライダーの位置を更新します。 (ユーザーがスライダーをドラッグしている場合にのみ受け取られます)。
WM_WININICHANGE スライダーの寸法を初期化します。

 

トラックバー ツールヒント

TBS_TOOLTIPS スタイルで作成されたトラックバーには規定のツールヒント コントロールがあります。 ツールヒントは表示されたままとなり、ユーザーがマウスを使用してスライダーをドラッグすると現在の値が表示されます。

TBM_SETTOOLTIPS メッセージを送信するとトラックバーに新しいツールヒント コントロールを割り当てることができます。 割り当てたツールヒント コントロールへのハンドルを取得するには、TBM_GETTOOLTIPS メッセージを使用します。