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
,輪轉訊息。
若要利用自動捲動,請從 CScrollView
衍生您的檢視類別,而不是從衍生。CView
第一次建立檢視時,如果您想要根據檔的大小計算可捲動檢視的大小,請從 或CView::OnUpdate
的覆寫CView::OnInitialUpdate
呼叫SetScrollSizes
成員函式。 (您必須撰寫自己的程式碼來查詢檔案的大小。如需範例,請參閱 Scribble 範例。)
對成員函式的呼叫 SetScrollSizes
會設定檢視的對應模式、捲動檢視的總維度,以及水準和垂直捲動的數量。 所有大小都是以邏輯單元為單位。 檢視的邏輯大小通常是從儲存在檔案中的數據計算,但在某些情況下,您可能會想要指定固定大小。 如需這兩種方法的範例,請參閱 CScrollView::SetScrollSizes
。
您可以指定要以邏輯單元水準和垂直捲動的數量。 根據預設,如果使用者在滾動盒外按下滾動條軸, CScrollView
則會捲動「頁面」。如果使用者在滾動條的任一端按兩下滾動箭頭, CScrollView
則會捲動「線條」。根據預設,頁面是檢視大小總計的 1/10;一行是頁面大小的 1/10。 傳遞成員函式中的 SetScrollSizes
自定義大小,以覆寫這些預設值。 例如,您可以將水準大小設定為總大小寬度的一些分數,並將垂直大小設定為目前字型中線條的高度。
您可以自動將檢視調整為目前的視窗大小, CScrollView
而不是捲動。 在此模式中,檢視沒有滾動條,而且邏輯檢視會延展或縮小,以完全符合視窗的工作區。 若要使用此調整成適合的功能,請呼叫 CScrollView::SetScaleToFitSize
。 (呼叫 SetScaleToFitSize
或 SetScrollSizes
,但不是兩者。
OnDraw
呼叫衍生檢視類別的成員函式之前,CScrollView
自動調整其傳遞至 OnDraw
之CPaintDC
裝置內容對象的檢視區原點。
若要調整卷動視窗的檢視區原點, CScrollView
請 CView::OnPrepareDC
覆寫 。 這項調整是針對傳遞給OnDraw
的裝置內容CScrollView
自動調整,CPaintDC
但您必須自行呼叫CScrollView::OnPrepareDC
您使用的任何其他裝置內容,例如 CClientDC
。 您可以覆寫 CScrollView::OnPrepareDC
來設定畫筆、背景色彩和其他繪圖屬性,但呼叫基類來執行縮放。
滾動條可以出現在相對於檢視的三個位置,如下列情況所示:
您可以使用 和
WS_VSCROLL
Windows 樣式來設定檢視WS_HSCROLL
的標準視窗樣式滾動條。滾動條控制項也可以新增至包含檢視的框架,在此情況下,架構會將框架轉送和
WM_VSCROLL
訊息從框架視窗轉寄WM_HSCROLL
至目前使用中的檢視。架構也會將訊息從
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
要填滿區域的筆刷。
備註
在 FillOutsideRect
卷動檢視的 OnEraseBkgnd
處理程式函式中使用,以避免過度重繪背景。
範例
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 子框架視窗中的檢視。 在ResizeParentToFit
衍生CScrollView
類別的處理程式函式中使用OnInitialUpdate
。 如需這個成員函式的範例,請參閱 CScrollView::SetScrollSizes
。
ResizeParentToFit
假設已設定檢視視窗的大小。 如果呼叫 時 ResizeParentToFit
尚未設定檢視視窗大小,您將會收到判斷提示。 若要確保這不會發生,請先進行下列呼叫,再呼叫 ResizeParentToFit
:
GetParentFrame()->RecalcLayout();
CScrollView::ScrollToPosition
呼叫 ScrollToPosition
以卷動至檢視中的指定點。
void ScrollToPosition(POINT pt);
參數
pt
要捲動至的點,以邏輯單元表示。 成員 x
必須是正值(大於或等於0,最多等於檢視的總大小)。 y
當對應模式為 MM_TEXT
時,成員也是如此。 成員 y
在 以外的 MM_TEXT
對應模式中為負數。
備註
檢視將會捲動,使這個點位於視窗的左上角。 如果檢視調整為符合,則不得呼叫此成員函式。
CScrollView::SetScaleToFitSize
SetScaleToFitSize
當您要將檢視區大小自動調整為目前視窗大小時呼叫 。
void SetScaleToFitSize(SIZE sizeTotal);
參數
sizeTotal
要調整檢視的水準和垂直大小。 捲動檢視的大小是以邏輯單位來測量。 水準大小包含在成員中 cx
。 垂直大小包含在成員中 cy
。 cx
和 cy
必須大於或等於 0。
備註
使用滾動條時,隨時只能顯示邏輯檢視的一部分。 但是,由於縮放到調整功能,檢視沒有滾動條,而且邏輯檢視會伸展或縮小,以完全符合視窗的工作區。 當視窗重設大小時,檢視會根據視窗的大小,以新的縮放比例繪製其數據。
您通常會在檢視成員函式的覆寫中放置 對的OnInitialUpdate
呼叫SetScaleToFitSize
。 如果您不想要自動調整,請改為呼叫 SetScrollSizes
成員函式。
SetScaleToFitSize
可用來實作「縮放調整」作業。 使用 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_TWIPS |
1/1440 in | 向上 |
MM_HIENGLISH |
0.001 in | 向上 |
MM_LOMETRIC |
0.1 公厘 | 向上 |
MM_LOENGLISH |
0.01 in | 向上 |
所有這些模式都是由 Windows 所定義。 兩種標準對應模式 MM_ISOTROPIC
和 MM_ANISOTROPIC
不會用於 CScrollView
。 類別庫提供 SetScaleToFitSize
將檢視調整為視窗大小的成員函式。 上述表格中的第三欄描述座標方向。
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 對應模式。 如果您要使用不受限制的對應模式,請呼叫 SetScaleToFitSize
成員函式, SetScrollSizes
而不是 。
範例
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());
}