CScrollView クラス

スクロール機能を備えた 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_PREVSetScrollPosの呼び出しをテストします。

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

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

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

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

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

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

スクロール ウィンドウのビューポートの原点を調整するには、CView::OnPrepareDCをオーバーライドCScrollView。 この調整は、OnDrawに渡CScrollViewCPaintDCデバイス コンテキストに対して自動的に行われますが、CClientDCなど、他のデバイス コンテキストに対して自分でCScrollView::OnPrepareDCを呼び出す必要があります。 CScrollView::OnPrepareDCをオーバーライドしてペン、背景色、およびその他の描画属性を設定できますが、基本クラスを呼び出してスケーリングを行うことができます。

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

  • WS_HSCROLLWS_VSCROLL Windows スタイルを使用して、ビューの標準ウィンドウ スタイルのスクロール バーを設定できます

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

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

CScrollViewの使用方法の詳細については、「Document/View Architecture MFC で使用可能なクラスの表示を参照してください。

継承階層

CObject

CCmdTarget

CWnd

CView

CScrollView

要件

ヘッダー: afxwin.h

CScrollView::CheckScrollBars

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

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

パラメーター

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

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

CScrollView::CScrollView

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

CScrollView();

解説

スクロール ビューを使用するには、 SetScrollSizes または SetScaleToFitSize を呼び出す必要があります。

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;

戻り値

論理単位でのスクロール ビューの合計サイズ。 水平方向のサイズは、CSize戻り値のcx メンバー内にあります。 垂直サイズは、 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_TEXTされている場合、y メンバーにも同じことが当てはまります。 y メンバーは、MM_TEXT以外のマッピング モードでは負の値になります。

解説

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

CScrollView::SetScaleToFitSize

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

void SetScaleToFitSize(SIZE sizeTotal);

パラメーター

sizeTotal
ビューを拡大縮小する水平方向と垂直方向のサイズ。 スクロール ビューのサイズは論理単位で測定されます。 水平サイズは、 cx メンバーに含まれています。 垂直サイズは、 cy メンバーに含まれています。 cxcyの両方が 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 によって定義されます。 CScrollViewには、MM_ISOTROPICMM_ANISOTROPICの 2 つの標準マッピング モードは使用されません。 クラス ライブラリには、ビューをウィンドウ サイズにスケーリングするための SetScaleToFitSize メンバー関数が用意されています。 上の表の列 3 は、座標の向きを示しています。

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

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

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

解説

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

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

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

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

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

マッピング モードは、 MM_ISOTROPIC または MM_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 クラス