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_DOWN
、 VK_PREV
、 SetScrollPos
の呼び出しをテストします。
メッセージ マップされた OnMouseWheel
と OnRegisteredMouseWheel
メンバー関数をオーバーライドすることで、マウス ホイールのスクロールを自分で処理できます。 これらのメンバー関数は、 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
に渡CScrollView
CPaintDC
デバイス コンテキストに対して自動的に行われますが、CClientDC
など、他のデバイス コンテキストに対して自分でCScrollView::OnPrepareDC
を呼び出す必要があります。 CScrollView::OnPrepareDC
をオーバーライドしてペン、背景色、およびその他の描画属性を設定できますが、基本クラスを呼び出してスケーリングを行うことができます。
スクロール バーは、次の場合に示すように、ビューを基準にして 3 つの場所に表示できます。
WS_HSCROLL
とWS_VSCROLL
Windows スタイルを使用して、ビューの標準ウィンドウ スタイルのスクロール バーを設定できます。スクロール バー コントロールは、ビューを含むフレームに追加することもできます。この場合、フレームワークはフレーム ウィンドウから現在アクティブなビューに
WM_HSCROLL
メッセージとWM_VSCROLL
メッセージを転送します。フレームワークは、
CSplitterWnd
分割コントロールから現在アクティブな分割ウィンドウ (ビュー) にスクロール メッセージを転送します。 共有スクロール バーを持つCSplitterWnd
に配置すると、CScrollView
オブジェクトは独自のスクロール バーを作成するのではなく、共有されたスクロール バーを使用します。
CScrollView
の使用方法の詳細については、「Document/View Architectureと MFC で使用可能なクラスの表示を参照してください。
継承階層
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
メンバーに含まれています。 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 によって定義されます。 CScrollView
には、MM_ISOTROPIC
とMM_ANISOTROPIC
の 2 つの標準マッピング モードは使用されません。 クラス ライブラリには、ビューをウィンドウ サイズにスケーリングするための 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_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());
}