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_PREV
한 VK_DOWN
후 호출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
. 이 조정은 전달OnDraw
되는 CScrollView
디바이스 컨텍스트에 대해 CPaintDC
자동으로 수행되지만 사용하는 다른 디바이스 컨텍스트(예: CClientDC
.)에 대해 자신을 호출 CScrollView::OnPrepareDC
해야 합니다. 재정의하여 펜, 배경색 및 기타 그리기 특성을 설정할 수 있지만 기본 클래스를 호출하여 크기 조정을 수행할 수 CScrollView::OnPrepareDC
있습니다.
스크롤 막대는 다음과 같은 경우와 같이 뷰를 기준으로 세 곳에 표시할 수 있습니다.
Windows 스타일과
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;
Return Value
스크롤 상자의 가로 및 세로 위치(디바이스 단위)를 개체로 사용합니다 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;
Return Value
스크롤 상자의 가로 및 세로 위치(논리 단위)를 개체로 사용합니다 CPoint
.
설명
이 좌표 쌍은 보기의 왼쪽 위 모서리가 스크롤된 문서의 위치에 해당합니다.
GetScrollPosition
는 논리 단위의 값을 반환합니다. 디바이스 단위를 원하는 경우 대신 사용합니다 GetDeviceScrollPosition
.
CScrollView::GetTotalSize
스크롤 보기의 현재 가로 및 세로 크기를 검색하려면 호출 GetTotalSize
합니다.
CSize GetTotalSize() const;
Return Value
스크롤 보기의 총 크기(논리 단위)입니다. 가로 크기는 cx
반환 값의 멤버에 있습니다 CSize
. 세로 크기가 멤버에 있습니다 cy
.
CScrollView::ResizeParentToFit
보기의 크기가 프레임 창의 크기를 지정하도록 하려면 호출 ResizeParentToFit
합니다.
void ResizeParentToFit(BOOL bShrinkOnly = TRUE);
매개 변수
bShrinkOnly
수행할 크기 조정의 종류입니다. 기본값인 FALSE
으로 인해 뷰는 항상 프레임 창의 크기를 정확하게 조정합니다. 프레임 창이 너무 커서 MDI(여러 문서 인터페이스) 프레임 창이나 화면에 맞지 않을 수 있으므로 다소 위험할 수 있습니다.
설명
MDI 자식 프레임 창의 보기에만 권장됩니다. 파생 클래스의 OnInitialUpdate
처리기 함수에 CScrollView
사용합니다ResizeParentToFit
. 이 멤버 함수의 예제는 다음을 참조하세요 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
포함됩니다. cy
둘 다 cx
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.01mm | 상승 |
MM_TWIPS |
1/1440 in | 상승 |
MM_HIENGLISH |
0.001 in | 상승 |
MM_LOMETRIC |
0.1mm | 상승 |
MM_LOENGLISH |
0.01 in | 상승 |
이러한 모든 모드는 Windows에서 정의됩니다. 두 가지 표준 매핑 모드 및 MM_ISOTROPIC
MM_ANISOTROPIC
.에 사용되지 CScrollView
않습니다. 클래스 라이브러리는 뷰를 SetScaleToFitSize
창 크기로 크기 조정하기 위한 멤버 함수를 제공합니다. 위 표의 열 3에서는 좌표 방향을 설명합니다.
sizeTotal
스크롤 보기의 총 크기입니다. 멤버에 cx
가로 익스텐트 포함 멤버에 cy
세로 범위가 포함됩니다. 크기는 논리 단위입니다. cy
둘 다 cx
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());
}