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_DOWN
VK_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
。 (いずれかを呼び出すかSetScaleToFitSize
SetScrollSizes
、両方を呼び出さない。
派生ビュー クラスの OnDraw
メンバー関数が呼び出される前に、 CScrollView
渡されるデバイス コンテキスト オブジェクトの CPaintDC
ビューポートの原点を自動的に OnDraw
調整します。
スクロール ウィンドウのビューポートの原点を調整するには、 CScrollView
オーバーライドします CView::OnPrepareDC
。 この調整は、渡されるデバイス コンテキストでは自動的CPaintDC
にOnDraw
行われますがCScrollView::OnPrepareDC
、使用するCScrollView
他のデバイス コンテキスト (.CClientDC
上書き CScrollView::OnPrepareDC
してペン、背景色、その他の描画属性を設定できますが、基本クラスを呼び出してスケーリングを行います。
スクロール バーは、次の場合に示すように、ビューを基準にして 3 つの場所に表示できます。
標準のウィンドウ スタイルのスクロール バーは、[ウィンドウ スタイル] と
WS_VSCROLL
[Windows スタイル] を使用してビューにWS_HSCROLL
設定できます。スクロール バー コントロールは、ビューを含むフレームに追加することもできます。その場合、フレームワークはフレーム ウィンドウから現在アクティブなビューに転送
WM_HSCROLL
およびWM_VSCROLL
メッセージを送信します。また、フレームワークは、分割コントロールから現在アクティブな
CSplitterWnd
分割ウィンドウ (ビュー) にスクロール メッセージを転送します。 共有スクロール バーにCSplitterWnd
配置すると、CScrollView
オブジェクトは独自のスクロール バーを作成するのではなく、共有スクロール バーを使用します。
使用CScrollView
の詳細については、「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;
戻り値
論理単位でのスクロール ビューの合計サイズ。 水平サイズは戻り値の 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_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 によって定義されます。 2 つの標準マッピング モードとMM_ANISOTROPIC
、 MM_ISOTROPIC
CScrollView
.. クラス ライブラリには、ビューを 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());
}
関連項目
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示