티스토리 뷰
MFC 스크롤 바
화면의 일정 영역을 스크롤하거나 정해진 범위의 값을 변경 시키는 용도로 사용한다.
윈도우 스크롤 바와 달리 스크롤 바 컨트롤은 원하는 수 만큼 만들어 사용할 수 있으므로 훨씬 유용하다.
사용자가 스크롤 바를 조작하면 WM_HSCROLL, WM_VSCROLL 메시지가 발생한다. 이 메시지와 더불어 사용자의 구체적인 행위를 알 수 있도록 스크롤 바 코드(Scroll-Bar Code)도 같이 전달 된다.
1
2 |
void OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);
void OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar); |
cs |
nSBCode : 아래 스크롤 바 코드표 참고
nPos : 스크롤 박스의 위치, SB_THUMBPOSITION 또는 SB_THUMBTRACK 인 경우에만 사용된다.
pScrollBar : 스크롤 바를 가르키는 포인터, WM_HSCROLL 메시지가 스크롤 바 컨트롤로 부터 발생한 것이면 스크롤 바 컨트롤을 조작할 수 있고, WM_HSCROLL 메시지가 윈도우의 스크롤 바 로부터 발생한 것이면 이 값은 NULL 이 된다.
<스크롤 바 코드>
스크롤 바 코드 |
의미 |
SB_LINELEFT, SB_LINERIGHT |
왼쪽 또는 오른쪽으로 한 단위 만큼 스크롤 |
SB_PAGELEFT, SB_PAGERIGHT |
왼쪽 또는 오른쪽으로 한 페이지 만큼 스크롤 |
SB_LINEUP, SB_LINEDOWN |
위쪽 또는 아래쪽으로 한 단위 만큼 스크롤 |
SB_PAGEUP. SB_PAGEDOWN |
위쪽 쪼는 아래쪽으로 한 페이지 만큼 스크롤 |
SB_THUMBPOSITION |
사용자가 스크롤 박스를 마우스로 끌다가 놓을때 발생한다. |
SB_THUMBTRACK |
사용자가 스크롤 박스를 마우스로 끌고 있을때 발생한다. |
1
2
3
4
5
6
7
8 |
// 스크롤 박스 위치값의 최소값과 최대값을 설정
void SetScrollRange(int nMinPos, int nMaxPos, BOOL bRedraw = TRUE);
// 스크롤 박스의 현재 위치를 설정
int SetScrollPos(int nPos, BOOL bRedraw = TRUE);
// 스크롤 박스의 현재 위치를 얻기
int GetScrollPos() const; |
cs |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66 |
class CMFCApplication5View : public CFormView
{
...
CScrollBar m_scrollbar1, m_scrollbar2;
};
void CMFCApplication5View::OnInitialUpdate()
{
...
m_scrollbar1.SetScrollRange(0, 360, FALSE); // 0~360 범위 설정
m_scrollbar1.SetScrollPos(0);
m_scrollbar2.SetScrollRange(0, 255, FALSE); // 0~255 범위 설정
m_scrollbar2.SetScrollPos(0);
}
void CMFCApplication5View::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
int nScrollPos;
if (pScrollBar->GetSafeHwnd() == m_scrollbar1.GetSafeHwnd())
{
switch (nSBCode)
{
case SB_LINELEFT:
nScrollPos = pScrollBar->GetScrollPos();
if (nScrollPos > 0)
{
pScrollBar->SetScrollPos(--nScrollPos);
SetDlgItemInt(IDC_EDIT3, nScrollPos);
Invalidate();
}
break;
case SB_THUMBTRACK:
pScrollBar->SetScrollPos(nPos);
SetDlgItemInt(IDC_EDIT3, nPos);
Invalidate();
break;
}
}
else if (pScrollBar->GetSafeHwnd() == m_scrollbar2.m_hWnd)
{
switch (nSBCode)
{
case SB_THUMBTRACK:
pScrollBar->SetScrollPos(nPos);
SetDlgItemInt(IDC_EDIT4, nPos);
Invalidate();
break;
}
}
CFormView::OnHScroll(nSBCode, nPos, pScrollBar);
}
void CMFCApplication5View::OnDraw(CDC* pDC)
{
LOGFONT lf;
::ZeroMemory(&lf, sizeof(lf));
lf.lfHeight = 300;
lf.lfEscapement = 10 * m_scrollbar1.GetScrollPos();
lf.lfOrientation = 10 * m_scrollbar1.GetScrollPos();
::lstrcpy(lf.lfFaceName, L"나눔고딕");
CFont font;
font.CreatePointFontIndirect(&lf);
pDC->SelectObject(&font);
pDC->SetTextColor(RGB(m_scrollbar2.GetScrollPos(), 0, 0));
pDC->TextOutW(200, 250, L"MFC");
} |
cs |
WM_DRAW 메시지 사용하려면 Doc/View 구조라도 대화상자 기반이라면 onDraw() 가 자동으로 추가 안되므로 가상함수 재정의 해야 한다.