더북(TheBook)

이벤트 처리기 마법사에서 메시지 형식 중 EN_CHANGE를 선택하자. EN_CHANGE 메시지에서 E는 에디트 컨트롤Edit control의 첫 글자이고, N은 통지Notification의 첫 글자를 의미한다. 그리고 뒤에 쓰여진 CHANGE는 이 메시지가 에디트 컨트롤에 쓰여진 글자에 변화가 있을 때 발생함을 의미한다. 이 통지 메시지를 처리할 클래스를 오른쪽 클래스 목록에서 고를 수 있으며, 여기서는 당연히 CBrightnessContrastDlg를 선택하도록 하자. 함수 처리기 이름은 자동으로 EN_CHANGE라는 통지 메시지와 에디트 컨트롤의 아이디인 ID_BRIGHNESS_EDIT를 이용하여 OnEnChangeBrightnessEdit라고 자동으로 결정된다. 선택이 끝났으면 [추가 및 편집] 버튼을 클릭하자. 이와 동일한 작업을 명암비 조절을 위한 에디트 컨트롤에 대해 반복하면, OnEnChangeContrastEdit 함수가 추가될 것이다. OnEnChangeBrightnessEditOnEnChangeContrastEdit 함수에 추가해야 할 코드는 소스 6-9에 나타내었다.

소스 6-9 에디트 컨트롤 값 변경 시 슬라이더 컨트롤 위치 조절(BrightnessContrastDlg.cpp)
void CBrightnessContrastDlg:: OnEnChangeBrightnessEdit()
{
    UpdateData(TRUE);
    m_sliderBrightness.SetPos(m_nBrightness);
}

void CBrightnessContrastDlg:: OnEnChangeContrastEdit()
{
    UpdateData(TRUE);
    m_sliderContrast.SetPos(m_nContrast);
}

소스 6-9에 나타난 두 함수는 유사한 형태로 코드가 작성되어 있다. OnEnChangeBrightnessEdit 함수에서 가장 먼저 UpdateData(TRUE) 함수를 호출하였는데, 이 경우 사용자가 에디트 컨트롤에 입력한 숫자 값이 m_nBrightness 멤버 변수에 저장된다. 그리고 바로 다음 줄에서는 CSliderCtrl 클래스의 멤버 함수인 SetPos 함수를 호출하여 슬라이더 컨트롤의 엄지 단추를 m_nBrightness 값에 해당하는 위치로 변경하였다. OnEnChangeContrastEdit 함수도 동일한 방식으로 동작한다.

이것으로 CBrightnessContrastDlg 클래스의 모든 디자인과 코딩이 완료되었다. 이제 실제로 밝기/명암비 조절 대화 상자를 사용하는 코드를 만들어보자.

Note | 대화 상자 컨트롤 메시지의 처리

MFC 프로그래밍에서 일반적으로 WM_로 시작되는 윈도우 메시지들은 그 메시지를 발생시킨 윈도우 클래스에서 처리한다. CImageToolView 클래스에서 WM_LBUTTONDOWN 또는 WM_MOUSEMOVE 등의 메시지를 처리하기 위해 OnLButtonDown 또는 OnMouseMove 등의 함수를 추가했던 것을 기억할 것이다. 대화 상자의 컨트롤들도 윈도우이기 때문에, 이들 윈도우에서 발생한 윈도우 메시지들도 해당 컨트롤에서 처리해야 하는 것이 맞아 보인다. 그러나 이 컨트롤들의 메시지를 처리하기 위해서는 모든 컨트롤에 대한 새로운 자식 클래스를 만들어야 하는 단점이 있다. 그러므로 이러한 대화 상자의 컨트롤들에 대한 윈도우 메시지 처리는 컨트롤 자신이 아니라 대화 상자의 클래스에서 처리하도록 하고 있다. 이처럼 대화 상자 내의 컨트롤에서 발생하여 대화 상자로 전달되는 메시지를 통지 메시지(notification message)라고 부른다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.