더북(TheBook)

먼저 슬라이더 컨트롤을 움직였을 때 에디트 컨트롤 값을 변경하는 방법에 대하여 알아보자. 슬라이더 컨트롤의 단추를 왼쪽 또는 오른쪽으로 움직일 경우, 대화 상자에서 WM_HSCROLL 메시지가 발생한다. 이 메시지는 WM_로 시작하는 윈도우 메시지이며, H는 가로 방향을 나타내는 Horizontal의 약자이고, SCROLL은 말 그대로 스크롤될 때 발생하는 메시지임을 나타낸다. 만약 슬라이더 컨트롤을 세로 방향으로 세워서 대화 상자에 배치하였다면, 그때는 WM_VSCROLL 메시지가 발생하게 된다. 여기서 V는 세로 방향을 나타내는 영어 Vertical의 약자이다. 사실 WM_HSCROLL 메시지는 슬라이더 컨트롤뿐만이 아니라 가로 스크롤 바Horizontal Scroll Bar가 움직일 때에도 발생하는 범용적인 가로 방향 스크롤을 알려주는 메시지이다. 그러므로 이 메시지를 처리하는 함수에서는 이 메시지가 어느 컨트롤에서 발생하였는지를 확인하여 동작을 지정해야 한다.

일단 CBrightnessContrastDlg 클래스에 WM_HSCROLL 메시지를 처리하는 함수를 추가해보자. 윈도우 메시지 처리기 추가는 클래스 마법사를 이용하여 쉽게 할 수 있다. 그림 6-18을 참조하여, CBrightnessContrastDlg 클래스에 WM_HSCROLL 메시지를 처리하는 OnHScroll 함수를 추가하자.

그림 6-18 슬라이더 컨트롤의 가로 스크롤 이벤트 처리 함수 추가

OnHScroll 함수가 정상적으로 추가되었다면, 이제 함수에 들어갈 소스 코드를 작성해보자. OnHScroll 함수는 다음과 같이 세 개의 인자를 받는다.

afx_msg void OnHScroll(
    UINT nSBCode,
    UINT nPos,
    CScrollBar* pScrollBar
);

첫 번째 함수의 인자인 nSBCode는 사용자가 수행한 스크롤의 방식을 알려준다. 즉, 스크롤이 왼쪽으로 되었는지, 오른쪽으로 되었는지 등의 정보를 알려준다. 두 번째 인자 nPosnSBCode가 SB_THUMBPOSITION 또는 SB_THUMBTRACK으로 설정되어 있는 경우에 한하여 현재 스크롤 위치를 알려준다. 세 번째 인자 pScrollBar는 스크롤을 발생시킨 윈도우의 포인터를 넘겨준다. 이 인자들을 이용하여 슬라이더 컨트롤이 스크롤될 때의 동작을 제어하는 소스 코드를 소스 6-8에 나타내었다.

소스 6-8 슬라이더 컨트롤 조절 시 에디트 컨트롤 값 변경(BrightnessContrastDlg.cpp)
void CBrightnessContrastDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
    // 밝기 조절 슬라이드바에서 발생한 WM_HSCROLL 메시지 처리
    if (m_sliderBrightness.GetSafeHwnd() == pScrollBar->GetSafeHwnd())
    {
        m_nBrightness = m_sliderBrightness.GetPos();
        UpdateData(FALSE);
    }
    // 명암비 조절 슬라이드바에서 발생한 WM_HSCROLL 메시지 처리
    else if (m_sliderContrast.GetSafeHwnd() == pScrollBar->GetSafeHwnd())
    {
        m_nContrast = m_sliderContrast.GetPos();
        UpdateData(FALSE);
    }
    CDialogEx::OnHScroll(nSBCode, nPos, pScrollBar);
}
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.