CScrollView クラス

スクロール機能を備えた A CView

構文

class CScrollView : public CView

メンバー

保護されたコンストラクター

名前 説明
CScrollView::CScrollView CScrollView オブジェクトを構築します。

パブリック メソッド

名前 説明
CScrollView::CheckScrollBars スクロール ビューに水平スクロール バーと垂直スクロール バーがあるかどうかを示します。
CScrollView::FillOutsideRect スクロール領域の外側にあるビューの領域を塗りつぶします。
CScrollView::GetDeviceScrollPosition デバイス単位での現在のスクロール位置を取得します。
CScrollView::GetDeviceScrollSizes 現在のマッピング モード、合計サイズ、スクロール可能ビューの行とページ サイズを取得します。 サイズはデバイス単位です。
CScrollView::GetScrollPosition 現在のスクロール位置を論理単位で取得します。
CScrollView::GetTotalSize 論理単位でのスクロール ビューの合計サイズを取得します。
CScrollView::ResizeParentToFit ビューのサイズがフレームのサイズを決定します。
CScrollView::ScrollToPosition 論理単位で指定された特定のポイントまでビューをスクロールします。
CScrollView::SetScaleToFitSize スクロール ビューを拡大/縮小モードにします。
CScrollView::SetScrollSizes スクロール ビューのマッピング モード、合計サイズ、および水平方向と垂直方向のスクロール量を設定します。

解説

メッセージ マップOnHScroll関数とOnVScrollメンバー関数をオーバーライドすることで、派生クラスCViewの標準スクロールを自分で処理できます。 ただし、 CScrollView その機能には次の機能が CView 追加されます。

  • ウィンドウとビューポートのサイズとマッピング モードを管理します。

  • スクロール バーメッセージに応答して自動的にスクロールします。

  • キーボード、スクロールしないマウス、または IntelliMouse ホイールからのメッセージに応答して、自動的にスクロールします。

キーボードからのメッセージに応答して自動的にスクロールするには、メッセージをWM_KEYDOWN追加し、テストしてVK_DOWNVK_PREV呼び出しますSetScrollPos

メッセージ マップ OnMouseWheel 関数と OnRegisteredMouseWheel メンバー関数をオーバーライドすることで、マウス ホイールのスクロールを自分で処理できます。 これらのメンバー関数は CScrollView、ホイール回転メッセージに対 WM_MOUSEWHEELして推奨される動作をサポートします。

自動スクロールを利用するには、ビュー クラス CScrollView を派生元ではなく CView. ビューが最初に作成されるときに、ドキュメントのサイズに基づいてスクロール可能なビューのサイズを計算する場合は、いずれかのCView::OnInitialUpdateオーバーライドからメンバー関数を呼び出SetScrollSizesしますCView::OnUpdate。 (ドキュメントのサイズを照会するには、独自のコードを記述する必要があります。例については、Scribble サンプル参照してください)。

メンバー関数を SetScrollSizes 呼び出すと、ビューのマッピング モード、スクロール ビューの合計ディメンション、および水平方向と垂直方向にスクロールする量が設定されます。 すべてのサイズは論理単位です。 通常、ビューの論理サイズはドキュメントに格納されているデータから計算されますが、場合によっては固定サイズを指定することもできます。 両方の方法の例については、次を参照してください CScrollView::SetScrollSizes

水平方向および垂直方向にスクロールする量を論理単位で指定します。 既定では、ユーザーがスクロール ボックスの外側にあるスクロール バー シャフトをクリックすると、 CScrollView "ページ" がスクロールされます。ユーザーがスクロール バーのいずれかの端にあるスクロール矢印をクリックした場合は、 CScrollView "行" をスクロールします。既定では、ページはビューの合計サイズの 1/10 です。行はページ サイズの 1/10 です。 メンバー関数でカスタム サイズを渡すことによって、これらの既定値を SetScrollSizes オーバーライドします。 たとえば、水平方向のサイズを合計サイズの幅の一部に設定し、縦のサイズを現在のフォントの行の高さに設定できます。

スクロールする代わりに、 CScrollView ビューを現在のウィンドウ サイズに自動的にスケーリングできます。 このモードでは、ビューにはスクロール バーがなく、論理ビューはウィンドウのクライアント領域に合わせて拡大または縮小されます。 このスケール ツー フィット機能を使用するには、次を呼び出します CScrollView::SetScaleToFitSize。 (いずれかを呼び出すかSetScaleToFitSizeSetScrollSizes、両方を呼び出さない。

派生ビュー クラスの OnDraw メンバー関数が呼び出される前に、 CScrollView 渡されるデバイス コンテキスト オブジェクトの CPaintDC ビューポートの原点を自動的に OnDraw調整します。

スクロール ウィンドウのビューポートの原点を調整するには、 CScrollView オーバーライドします CView::OnPrepareDC。 この調整は、渡されるデバイス コンテキストでは自動的CPaintDCOnDraw行われますがCScrollView::OnPrepareDC、使用するCScrollView他のデバイス コンテキスト (.CClientDC 上書き CScrollView::OnPrepareDC してペン、背景色、その他の描画属性を設定できますが、基本クラスを呼び出してスケーリングを行います。

スクロール バーは、次の場合に示すように、ビューを基準にして 3 つの場所に表示できます。

  • 標準のウィンドウ スタイルのスクロール バーは、[ウィンドウ スタイル] と WS_VSCROLL[Windows スタイル] を使用してビューにWS_HSCROLL設定できます。

  • スクロール バー コントロールは、ビューを含むフレームに追加することもできます。その場合、フレームワークはフレーム ウィンドウから現在アクティブなビューに転送 WM_HSCROLL および WM_VSCROLL メッセージを送信します。

  • また、フレームワークは、分割コントロールから現在アクティブな CSplitterWnd 分割ウィンドウ (ビュー) にスクロール メッセージを転送します。 共有スクロール バーに CSplitterWnd 配置すると、 CScrollView オブジェクトは独自のスクロール バーを作成するのではなく、共有スクロール バーを使用します。

使用CScrollViewの詳細については、「MFC で使用できるドキュメント/ビュー アーキテクチャと派生ビュー クラス」を参照してください。

継承階層

CObject

CCmdTarget

CWnd

CView

CScrollView

必要条件

ヘッダー:afxwin.h

CScrollView::CheckScrollBars

スクロール ビューに水平バーと垂直バーがあるかどうかを判断するには、このメンバー関数を呼び出します。

void CheckScrollBars(
    BOOL& bHasHorzBar,
    BOOL& bHasVertBar) const;

パラメーター

bHasHorzBar
アプリケーションに水平スクロール バーがあることを示します。

bHasVertBar
アプリケーションに垂直スクロール バーがあることを示します。

CScrollView::CScrollView

CScrollView オブジェクトを構築します。

CScrollView();

解説

スクロール ビューを使用できるようにするには、そのSetScrollSizesSetScaleToFitSize前に呼び出す必要があります。

CScrollView::FillOutsideRect

スクロール領域の外側に表示されるビューの領域を塗りつぶす呼び出 FillOutsideRect し。

void FillOutsideRect(
    CDC* pDC,
    CBrush* pBrush);

パラメーター

pDC
入力を行うデバイス コンテキスト。

pBrush
領域を塗りつぶすブラシ。

解説

スクロール ビューのOnEraseBkgndハンドラー関数で、過剰な背景の再描画を防ぐために使用FillOutsideRectします。

BOOL CMyScrollView::OnEraseBkgnd(CDC* pDC)
{
   CBrush br(GetSysColor(COLOR_WINDOW));
   FillOutsideRect(pDC, &br);
   return TRUE;                   // Erased
}

CScrollView::GetDeviceScrollPosition

スクロール バー内のスクロール ボックスの現在の水平位置と垂直方向の位置が必要な場合に呼び出 GetDeviceScrollPosition します。

CPoint GetDeviceScrollPosition() const;

戻り値

スクロール ボックスの水平方向および垂直方向の位置 (デバイス単位) を CPoint オブジェクトとして指定します。

解説

この座標ペアは、ビューの左上隅がスクロールされたドキュメント内の位置に対応します。 これは、マウスデバイスの位置をスクロールビューデバイスの位置にオフセットする場合に便利です。

GetDeviceScrollPosition はデバイス単位で値を返します。 論理ユニットが必要な場合は、代わりに使用 GetScrollPosition します。

CScrollView::GetDeviceScrollSizes

GetDeviceScrollSizes は、スクロール可能ビューの現在のマッピング モード、合計サイズ、および行とページ サイズを取得します。

void GetDeviceScrollSizes(
    int& nMapMode,
    SIZE& sizeTotal,
    SIZE& sizePage,
    SIZE& sizeLine) const;

パラメーター

nMapMode
このビューの現在のマッピング モードを返します。 使用可能な値の一覧については、次を参照してください SetScrollSizes

sizeTotal
スクロール ビューの現在の合計サイズをデバイス単位で返します。

sizePage
スクロール バー 軸のマウス クリックに応じて、各方向にスクロールする現在の水平方向および垂直方向の量を返します。 メンバーには cx 水平方向の量が含まれます。 メンバーには cy 垂直方向の量が含まれています。

sizeLine
スクロール矢印のマウス クリックに応じて、各方向にスクロールする現在の水平方向および垂直方向の量を返します。 メンバーには cx 水平方向の量が含まれます。 メンバーには cy 垂直方向の量が含まれています。

解説

サイズはデバイス単位です。 このメンバー関数はほとんど呼び出されない。

CScrollView::GetScrollPosition

スクロール バー内のスクロール ボックスの現在の水平位置と垂直方向の位置が必要な場合に呼び出 GetScrollPosition します。

CPoint GetScrollPosition() const;

戻り値

スクロール ボックスの水平方向および垂直方向の位置 (論理単位) を CPoint オブジェクトとして指定します。

解説

この座標ペアは、ビューの左上隅がスクロールされたドキュメント内の位置に対応します。

GetScrollPosition は論理単位で値を返します。 デバイス ユニットが必要な場合は、代わりに使用 GetDeviceScrollPosition します。

CScrollView::GetTotalSize

スクロール ビューの現在の水平および垂直サイズを取得する呼び出し GetTotalSize

CSize GetTotalSize() const;

戻り値

論理単位でのスクロール ビューの合計サイズ。 水平サイズは戻り値の cx メンバーにあります CSize 。 垂直サイズはメンバー内にあります cy

CScrollView::ResizeParentToFit

ビューのサイズがフレーム ウィンドウのサイズを決める呼び出し ResizeParentToFit

void ResizeParentToFit(BOOL bShrinkOnly = TRUE);

パラメーター

bShrinkOnly
実行するサイズ変更の種類。 既定値のフレーム ウィンドウは、 TRUE必要に応じて縮小されます。 スクロール バーは、大きなビューまたは小さなフレーム ウィンドウに対して引き続き表示されます。 値を FALSE 指定すると、ビューは常にフレーム ウィンドウのサイズを正確に変更します。 フレーム ウィンドウが大きすぎて複数のドキュメント インターフェイス (MDI) フレーム ウィンドウまたは画面に収まらない可能性があるため、これはやや危険な場合があります。

解説

これは、MDI 子フレーム ウィンドウのビューにのみ推奨されます。 派生CScrollViewクラスのOnInitialUpdateハンドラー関数で使用ResizeParentToFitします。 このメンバー関数の例については、次を参照してください CScrollView::SetScrollSizes

ResizeParentToFit は、ビュー ウィンドウのサイズが設定されていることを前提としています。 呼び出されたときに ResizeParentToFit ビュー ウィンドウのサイズが設定されていない場合は、アサーションが取得されます。 これが発生しないようにするには、呼び出す前に次の呼び出 ResizeParentToFitしを行います。

GetParentFrame()->RecalcLayout();

CScrollView::ScrollToPosition

ビュー内の特定のポイントまでスクロールする呼び出し ScrollToPosition

void ScrollToPosition(POINT pt);

パラメーター

pt
スクロール先のポイント (論理単位)。 メンバーは x 正の値である必要があります (0 以上、ビューの合計サイズまで)。 マッピング モードMM_TEXTy . 以外の y マッピング モード MM_TEXTでは、メンバーが負の値になります。

解説

このポイントがウィンドウの左上隅になるように、ビューがスクロールされます。 ビューが合わせて拡大縮小される場合は、このメンバー関数を呼び出してはなりません。

CScrollView::SetScaleToFitSize

ビューポートのサイズを現在のウィンドウ サイズに自動的にスケーリングする場合に呼び出 SetScaleToFitSize します。

void SetScaleToFitSize(SIZE sizeTotal);

パラメーター

sizeTotal
ビューを拡大縮小する水平方向と垂直方向のサイズ。 スクロール ビューのサイズは論理単位で測定されます。 水平サイズはメンバーに cx 含まれます。 垂直サイズはメンバーに cy 含まれます。 両方 cx とも、 cy 0 以上である必要があります。

解説

スクロール バーでは、論理ビューの一部のみをいつでも表示できます。 ただし、拡大/縮小機能を使用すると、ビューにはスクロール バーがなく、論理ビューはウィンドウのクライアント領域に正確に合わせて拡大または縮小されます。 ウィンドウのサイズが変更されると、ビューはウィンドウのサイズに基づいて新しいスケールでデータを描画します。

通常は、ビューOnInitialUpdateのメンバー関数のオーバーライドに呼び出しSetScaleToFitSizeを配置します。 自動スケーリングが不要な場合は、代わりにメンバー関数を SetScrollSizes 呼び出します。

SetScaleToFitSize は、"Zoom to Fit" 操作を実装するために使用できます。 スクロールを再初期化するために使用 SetScrollSizes します。

SetScaleToFitSize は、ビュー ウィンドウのサイズが設定されていることを前提としています。 呼び出されたときに SetScaleToFitSize ビュー ウィンドウのサイズが設定されていない場合は、アサーションが取得されます。 これが発生しないようにするには、呼び出す前に次の呼び出 SetScaleToFitSizeしを行います。

GetParentFrame()->RecalcLayout();

CScrollView::SetScrollSizes

ビューが更新されるときに呼び出 SetScrollSizes します。

void SetScrollSizes(
    int nMapMode,
    SIZE sizeTotal,
    const SIZE& sizePage = sizeDefault,
    const SIZE& sizeLine = sizeDefault);

パラメーター

nMapMode
このビューに設定するマッピング モード。 使用可能な値 :

マッピング モード 論理ユニット 正の y 軸の拡張...
MM_TEXT 1 ピクセル 下方修正
MM_HIMETRIC 0.01 mm 上向き
MM_TWIPS 1/1440 in 上向き
MM_HIENGLISH 0.001 in 上向き
MM_LOMETRIC 0.1 mm 上向き
MM_LOENGLISH 0.01 in 上向き

これらのモードはすべて Windows によって定義されます。 2 つの標準マッピング モードとMM_ANISOTROPICMM_ISOTROPICCScrollView.. クラス ライブラリには、ビューを SetScaleToFitSize ウィンドウ サイズにスケーリングするためのメンバー関数が用意されています。 上の表の列 3 は、座標の向きを示しています。

sizeTotal
スクロール ビューの合計サイズ。 メンバーには cx 水平エクステントが含まれています。 メンバーには cy 垂直方向のエクステントが含まれています。 サイズは論理単位です。 両方 cx とも、 cy 0 以上である必要があります。

sizePage
スクロール バー シャフト内のマウス クリックに応じて、各方向にスクロールする水平方向と垂直方向の量。 メンバーには cx 水平方向の量が含まれます。 メンバーには cy 垂直方向の量が含まれています。

sizeLine
スクロール矢印のマウス クリックに応じて、各方向にスクロールする水平方向と垂直方向の量。 メンバーには cx 水平方向の量が含まれます。 メンバーには cy 垂直方向の量が含まれています。

解説

メンバー関数の OnUpdate オーバーライドで呼び出して、ドキュメントが最初に表示されたときやサイズが変更されたときに、スクロール特性を調整します。

通常、ビューの関連ドキュメントからサイズ情報を取得するには、派生ドキュメント クラスで指定したドキュメント メンバー関数 (おそらく呼び出される) を呼び出 GetMyDocSizeします。 次のコードは、この方法を示しています。

CMyScrollDoc* pMyDoc = (CMyScrollDoc*)GetDocument();
SetScrollSizes(nMapMode, pMyDoc->GetMyDocSize());

または、次のコードのように、固定サイズを設定する必要がある場合があります。

SetScrollSizes(nMapMode, CSize(100, 100));

マッピング モードは、次を除くMM_ISOTROPICMM_ANISOTROPIC任意の Windows マッピング モードに設定する必要があります。 制約のないマッピング モードを使用する場合は、次の代わりにSetScrollSizesメンバー関数をSetScaleToFitSize呼び出します。

void CMyScrollView::OnUpdate(CView* /*pSender*/, LPARAM /*lHint*/,
   CObject* /*pHint*/)
{
   // Implement a GetMyDocSize() member function in 
   // your document class; it returns a CSize.
   CMyScrollDoc* pMyDoc = (CMyScrollDoc*)GetDocument();
   SetScrollSizes(MM_LOENGLISH, pMyDoc->GetMyDocSize());
   ResizeParentToFit();   // Default bShrinkOnly argument
}

 

void CMyScrollView::OnInitialUpdate()
{
   CScrollView::OnInitialUpdate();

   // The GetMyDocSize() member function is implemented in 
   // your document class. The return type is CSize.
   CMyScrollDoc* pMyDoc = (CMyScrollDoc*)GetDocument();
   SetScrollSizes(MM_TEXT, pMyDoc->GetMyDocSize());
}

関連項目

MFC サンプル DIBLOOK
CView クラス
階層図
CSplitterWnd クラス