MFC에서 기본적으로 CView 라는 녀석을 상속 받는 뷰 클래스를 생성할 수 있는데, 이녀석은 스크롤바가 달려있지 않다.
물론 스타일을 수정하여 스크롤바를 달 수도 있지만 MFC에서 제공해주는 CScrollView를 통해서 간단하게 해결할 수가 있다.
아래는 CView 를 상속 받는 AView 를 스크롤뷰로 변경하는 예제다.
***변 경 방 법***
[Step 1]
class AView : public CView 를
class AView : public CScrollView 로 변경
[Step 2]
IMPLEMENT_DYNCREATE(AView, CView)
BEGIN_MESSAGE_MAP(AView, CView) 를
IMPLEMENT_DYNCREATE(AView, CScrollView)
BEGIN_MESSAGE_MAP(AView, CScrollView) 로 변경
[Step 3]
OnInitialUpdate() 함수를 오버라이딩해서 SetScrollSizes() 함수를 호출함. SetScrollSizes() 함수를 호출하여 초기화 하지 않을 경우 오류를 발생시킴.
void AView::OnInitialUpdate()
{
CView::OnInitialUpdate();
// TODO: Add your specialized code here and/or call the base class
CRect rc;
GetClientRect(&rc);
CSize sizeViewPage;
sizeViewPage.cx = rc.right-rc.left;
sizeViewPage.cy = rc.bottom-rc.top;
CSize sizeViewPageTotal;
sizeViewPageTotal.cx = sizeViewPage.cx;
sizeViewPageTotal.cy = sizeViewPage.cy; // 3페이지를 설정하고 싶으면 * 3을 하면 되긋지
SetScrollSizes(MM_TEXT, sizeViewPageTotal);
}
[Step 4] - 이것은 필수가 아니다.
OnVScroll() , OnHScroll() 메시지 함수를 구현함. 구현하지 않아도 기본적으로 SetScrollSizes()함수에서 지정한 공간만큼의 동작을 행한다. 특별하게 다른 처리를 하고 싶다면 재지정한다.
void AView::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
// TODO: Add your message handler code here and/or call default
switch(nSBCode)
{
case SB_LINEUP:
case SB_LINEDOWN:
case SB_PAGEUP:
case SB_PAGEDOWN:
case SB_THUMBPOSITION:
case SB_THUMBTRACK:
break;
}
CScrollView::OnVScroll(nSBCode, nPos, pScrollBar);
}
void AView::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
// TODO: Add your message handler code here and/or call default
switch(nSBCode)
{
case SB_LINEUP:
case SB_LINEDOWN:
case SB_PAGEUP:
case SB_PAGEDOWN:
case SB_THUMBPOSITION:
case SB_THUMBTRACK:
break;
}
CScrollView::OnHScroll(nSBCode, nPos, pScrollBar);
}
위와 같은 기본적인 세팅이 완료되고 컴파일->실행 하게 되면 스크롤바가 붙어있는 윈도우가 생성되며 올바르게 동작한다.