4

WTL でチェックボックスを使用して独自のカスタム描画リストを作成しました。今はスクロール可能にしたいのですが、描画する静的テキスト コントロールをサブクラス化しています。静的コントロールがスクロールをサポートしているかどうかはわかりません。方法..とにかく私の質問は、カスタムメイドのコントロールをスクロール可能にする方法です.メカニズムを自分で実装する必要がありますか?

4

2 に答える 2

6

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:

非常に小さく、複雑さのほとんどをカバーしていることがわかります。

于 2013-08-11T15:09:52.627 に答える
6

はい、完全に手動で実装する必要があります。これが組み込みコントロールを使用しないことの欠点です。ListBox から始めて、必要に応じてカスタマイズする方がよいでしょう。そうすれば、スクロール、選択、およびその他のロジックをすべて無料で利用できます。

手順はおおまかに次のとおりです (これらの一部またはすべてにはおそらく ATL/WTL のイディオムがありますが、ATL/WTL プログラマーは生の Win32 から前後に変換できます)。

  1. 水平スクロール バー、垂直スクロール バー、または両方のスクロール バーが必要かどうかに応じて、WS_HSCROLLおよび/またはウィンドウ スタイルをカスタム スタティック コントロールに追加します。WS_VSCROLLこれらを CreateWindow/CreateWindowEx 関数に渡されるウィンドウ スタイルのリストに追加します。

  2. デフォルトでは、これらのスクロール バーは何もしません。関数を使用して何をすべきかを伝える必要がありSetScrollInfoます。あなたの場合:

    • 最初のパラメーター ( hwnd) は、コントロール ウィンドウへのハンドルになります。
    • 2 番目のパラメーター ( fnBar) はSB_HORZ、水平スクロール バーSB_VERTを調整するか、垂直スクロール バーを調整する必要があります。
    • 3 番目のパラメーター ( lpsi) は構造体へのポインターでありSCROLLINFO、現在のつまみの位置、最小値と最大値、比例スクロール バーの設定に使用される「ページ」サイズなど、目的のスクロール パラメーターが入力されます。
    • 4 番目のパラメーター ( fRedraw) は、おそらく に設定する必要がありますTRUE

  3. EnableScrollBarまた、必要に応じてスクロール バーを有効/無効にする機能も必要です。前の機能と同様に、

    • hwndコントロールウィンドウへのハンドルです
    • wSBflagsSB_HORZSB_VERT、またはSB_BOTH
    • wArrowsESB_*あなたが望むものに応じて 、値の1つです

  4. 最後に、カスタム コントロールのウィンドウ プロシージャにコードを記述して、WM_HSCROLLおよび/またはWM_VSCROLLメッセージを処理します。これらは、スクロール バーが移動するたびにウィンドウに送信されます。これらのメッセージのハンドラー内で、次のことを実行してコントロールの状態を更新する必要があります。

    • 関数を呼び出してSetScrollInfo、サムを新しい位置に更新します
    • スクロールした距離に従って、コントロールの内容を再描画します。これを行うには複数の方法がありますが、おそらくScrollWindowEx関数を使用します。

    カスタム コントロールのウィンドウ プロシージャは、メッセージを処理して、ウィンドウのサイズの変更に応答してスクロール バーの状態を (および/またはを呼び出して) 更新する必要もあります。WM_SIZESetScrollInfoEnableScrollBar

于 2013-08-11T14:53:25.040 に答える