WTL でチェックボックスを使用して独自のカスタム描画リストを作成しました。今はスクロール可能にしたいのですが、描画する静的テキスト コントロールをサブクラス化しています。静的コントロールがスクロールをサポートしているかどうかはわかりません。方法..とにかく私の質問は、カスタムメイドのコントロールをスクロール可能にする方法です.メカニズムを自分で実装する必要がありますか?
2 に答える
Cody Gray は、スクロールのサポートを追加するための優れた紹介を提供しましたが、WTL 自体からの支援も受けています。
WTLatlscrl.h
は、スクロールするカスタム ウィンドウ/コントロールを継承して実装するためのクラスを提供します。
// Classes in this file:
//
// CScrollImpl<T>
// CScrollWindowImpl<T, TBase, TWinTraits>
// CMapScrollImpl<T>
// CMapScrollWindowImpl<T, TBase, TWinTraits>
// CFSBWindowT<TBase>
// CZoomScrollImpl<T>
// CZoomScrollWindowImpl<T, TBase, TWinTraits>
// CScrollContainerImpl<T, TBase, TWinTraits>
// CScrollContainer
使用方法をデモするためのコード/スニペットはそれほど多くありませんが、基本をカバーする WTL サンプルが 1 つあります。これも出発点として適しています。\Samples\BmpView
スクロール可能なビットマップのクラスがあります:
class CBitmapView :
public CScrollWindowImpl<CBitmapView>
{
public:
非常に小さく、複雑さのほとんどをカバーしていることがわかります。
はい、完全に手動で実装する必要があります。これが組み込みコントロールを使用しないことの欠点です。ListBox から始めて、必要に応じてカスタマイズする方がよいでしょう。そうすれば、スクロール、選択、およびその他のロジックをすべて無料で利用できます。
手順はおおまかに次のとおりです (これらの一部またはすべてにはおそらく ATL/WTL のイディオムがありますが、ATL/WTL プログラマーは生の Win32 から前後に変換できます)。
水平スクロール バー、垂直スクロール バー、または両方のスクロール バーが必要かどうかに応じて、
WS_HSCROLL
および/またはウィンドウ スタイルをカスタム スタティック コントロールに追加します。WS_VSCROLL
これらを CreateWindow/CreateWindowEx 関数に渡されるウィンドウ スタイルのリストに追加します。デフォルトでは、これらのスクロール バーは何もしません。関数を使用して何をすべきかを伝える必要があり
SetScrollInfo
ます。あなたの場合:- 最初のパラメーター (
hwnd
) は、コントロール ウィンドウへのハンドルになります。 - 2 番目のパラメーター (
fnBar
) はSB_HORZ
、水平スクロール バーSB_VERT
を調整するか、垂直スクロール バーを調整する必要があります。 - 3 番目のパラメーター (
lpsi
) は構造体へのポインターでありSCROLLINFO
、現在のつまみの位置、最小値と最大値、比例スクロール バーの設定に使用される「ページ」サイズなど、目的のスクロール パラメーターが入力されます。 - 4 番目のパラメーター (
fRedraw
) は、おそらく に設定する必要がありますTRUE
。
- 最初のパラメーター (
EnableScrollBar
また、必要に応じてスクロール バーを有効/無効にする機能も必要です。前の機能と同様に、hwnd
コントロールウィンドウへのハンドルですwSBflags
SB_HORZ
、SB_VERT
、またはSB_BOTH
wArrows
ESB_*
あなたが望むものに応じて 、値の1つです
最後に、カスタム コントロールのウィンドウ プロシージャにコードを記述して、
WM_HSCROLL
および/またはWM_VSCROLL
メッセージを処理します。これらは、スクロール バーが移動するたびにウィンドウに送信されます。これらのメッセージのハンドラー内で、次のことを実行してコントロールの状態を更新する必要があります。- 関数を呼び出して
SetScrollInfo
、サムを新しい位置に更新します - スクロールした距離に従って、コントロールの内容を再描画します。これを行うには複数の方法がありますが、おそらく
ScrollWindowEx
関数を使用します。
カスタム コントロールのウィンドウ プロシージャは、メッセージを処理して、ウィンドウのサイズの変更に応答してスクロール バーの状態を (および/またはを呼び出して) 更新する必要もあります。
WM_SIZE
SetScrollInfo
EnableScrollBar
- 関数を呼び出して