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 스크롤 보기의 매핑 모드, 총 크기 및 가로 및 세로 스크롤 크기를 설정합니다.

설명

메시지 매핑 OnHScrollOnVScroll 멤버 함수를 재정의하여 파생된 클래스에서 CView 직접 표준 스크롤을 처리할 수 있습니다. 그러나 CScrollView 기능에 다음 기능을 CView 추가합니다.

  • 창 및 뷰포트 크기 및 매핑 모드를 관리합니다.

  • 스크롤 막대 메시지에 대한 응답으로 자동으로 스크롤됩니다.

  • 키보드, 스크롤하지 않는 마우스 또는 IntelliMouse 휠의 메시지에 대한 응답으로 자동으로 스크롤됩니다.

키보드의 메시지에 대한 응답으로 자동으로 스크롤하려면 메시지를 추가하고 WM_KEYDOWN 테스트 VK_PREVVK_DOWN후 호출SetScrollPos합니다.

메시지 매핑 OnMouseWheelOnRegisteredMouseWheel 멤버 함수를 재정의하여 마우스 휠 스크롤을 직접 처리할 수 있습니다. 이러한 멤버 함수는 CScrollView휠 회전 메시지에 권장 WM_MOUSEWHEEL되는 동작을 지원합니다.

자동 스크롤을 활용하려면 .CScrollViewCView 뷰를 처음 만들 때 문서 크기에 따라 스크롤 가능한 보기의 크기를 계산하려면 재정의 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_VSCROLLWindows 스타일을 사용하여 보기에 표준 창 스타일 스크롤 막대를 WS_HSCROLL 설정할 수 있습니다.

  • 스크롤 막대 컨트롤은 보기를 포함하는 프레임에 추가할 수도 있습니다. 이 경우 프레임워크는 프레임 창에서 현재 활성 보기로 전달 및 WM_VSCROLL 메시지를 전달합니다WM_HSCROLL.

  • 또한 프레임워크는 분할자 컨트롤에서 CSplitterWnd 현재 활성 분할자 창(보기)으로 스크롤 메시지를 전달합니다. 공유 스크롤 막대를 사용하여 CSplitterWnd 배치하는 경우 개체는 자체 스크롤 막대를 만드는 대신 공유 스크롤 막대 CScrollView 를 사용합니다.

사용에 CScrollView대한 자세한 내용은 MFC에서 사용할 수 있는 문서/보기 아키텍처 및 파생 뷰 클래스를 참조하세요.

상속 계층 구조

CObject

CCmdTarget

CWnd

CView

CScrollView

요구 사항

헤더afxwin.h:

CScrollView::CheckScrollBars

스크롤 보기에 가로 막대와 세로 막대가 있는지 확인하려면 이 멤버 함수를 호출합니다.

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

매개 변수

bHasHorzBar
애플리케이션에 가로 스크롤 막대가 있음을 나타냅니다.

bHasVertBar
애플리케이션에 세로 스크롤 막대가 있음을 나타냅니다.

CScrollView::CScrollView

CScrollView 개체를 생성합니다.

CScrollView();

설명

스크롤 보기를 사용하려면 먼저 호출 SetScrollSizesSetScaleToFitSize 해야 합니다.

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
수행할 크기 조정의 종류입니다. 기본값인 TRUE/&A는 적절한 경우 프레임 창을 축소합니다. 큰 보기 또는 작은 프레임 창에는 스크롤 막대가 계속 표시됩니다. 값 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_ISOTROPICMM_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_ISOTROPICMM_ANISOTROPIC모든 Windows 매핑 모드로 설정해야 합니다. 제한되지 않은 매핑 모드를 사용하려면 대신 멤버 함수SetScrollSizesSetScaleToFitSize 호출합니다.

예시

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 클래스