더북(TheBook)

잡음 추가 대화 상자의 디자인이 끝이 났으면, 이 대화 상자에 대한 클래스를 추가하자. 잡음 추가 대화 상자의 클래스 이름은 CAddNoiseDlg를 사용하기로 하고, 표 8-10을 참조하여 대화 상자 컨트롤들에 대한 멤버 변수 두 개를 추가하자.

표 8-10 잡음 추가 대화 상자에서 추가할 컨트롤 멤버 변수의 속성

ID

범주

변수 형식

변수 이름

최솟값

최댓값

IDC_NOISE_RADIO1

Value

int

m_nNoiseType

IDC_NOISE_AMOUNT

Value

int

m_nAmount

0

100

이제 대화 상자 디자인 창에서 할 일은 모두 완료하였다. 이제 이 대화 상자에 대한 초기화 작업을 추가해보자. 먼저 CAddNoiseDlg 클래스의 생성자에서 잡음의 양을 나타내는 m_nAmount 멤버 변수의 초깃값을 5로 변경하고, OnInitDialog 함수에서 스핀 컨트롤의 값 범위를 0부터 100으로 지정하자. 소스 8-14를 참고하라.

소스 8-14 잡음 추가 대화 상자 초기화(AddNoiseDlg.cpp)
CAddNoiseDlg::CAddNoiseDlg(CWnd* pParent /*=NULL*/)
    : CDialogEx(IDD_ADD_NOISE, pParent)
    , m_nNoiseType(0)
    , m_nAmount(5)
{

}
…
BOOL CAddNoiseDlg::OnInitDialog()
{
    CDialogEx::OnInitDialog();

    ((CSpinButtonCtrl*)GetDlgItem(IDC_SPIN_AMOUNT))->SetRange(0, 100);

    return TRUE;  // return TRUE unless you set the focus to a control
                  // 예외: OCX 속성 페이지는 FALSE를 반환해야 합니다.
}

소스 8-14에서 스핀 버튼의 범위를 설정하는 SetRange 함수의 사용 부분을 눈여겨보자. 여기서 GetDlgItem이라는 함수가 나오는데, 이 함수의 원형은 다음과 같다.

CWnd* GetDlgItem(int nID) const;

GetDlgItem 함수는 대화 상자에 추가된 컨트롤의 아이디를 인자로 받아 그 컨트롤에 해당하는 클래스 포인터를 CWnd* 타입으로 반환한다. 이 포인터를 실제 사용할 때에는 해당 컨트롤에 맞는 형태로 형변환하여 사용해야 한다. 만약 임시 지역 변수를 선언하여 포인터 주소를 받으려면 다음과 같이 코드를 작성할 수 있다.

CSpinButtonCtrl* pSpin = (CSpinButtonCtrl*) GetDlgItem(IDC_SPIN_AMOUNT);

CSpinButtonCtrl 클래스의 포인터를 얻었으니 이제 -> 연산자를 이용하여 CSpinButtonCtrl 클래스의 멤버 함수들을 호출하여 사용할 수 있다. SetRange 함수는 스핀 버튼이 나타낼 수 있는 값의 범위를 설정하는 함수이다. SetRange(0, 100) 형태로 코드를 작성할 경우, 스핀 버튼의 상하 버튼을 클릭하여 에디트 컨트롤의 값을 0부터 100까지 변경할 수 있다.

사실 이 코드는 스핀 버튼 컨트롤의 Control형 멤버 변수를 추가하여 보다 간단하게 바꿀 수도 있다. 즉, IDC_SPIN_AMOUNT에 해당하는 스핀 컨트롤에 대해 Control형 멤버 변수 m_spinAmountCSpinButtonCtrl 타입으로 추가하고, m_spinAmount.SetRange(0, 100);의 형태로 코드를 작성하여도 같은 동작을 수행하게 된다. 다만 멤버 변수로써 사용이 많지 않은 경우에는 GetDlgItem 함수를 사용하는 것도 나쁘지 않다.

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