티스토리 뷰

프로그래밍/MFC

MFC 스크롤 바

에어버스 2016. 6. 26. 17:17

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(0360, FALSE); // 0~360 범위 설정
    m_scrollbar1.SetScrollPos(0);
    m_scrollbar2.SetScrollRange(0255, 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(), 00));
    pDC->TextOutW(200250, L"MFC");
}
cs

WM_DRAW 메시지 사용하려면 Doc/View 구조라도 대화상자 기반이라면 onDraw() 가 자동으로 추가 안되므로 가상함수 재정의 해야 한다.

 

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
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