잡음 추가 대화 상자의 디자인이 끝이 났으면, 이 대화 상자에 대한 클래스를 추가하자. 잡음 추가 대화 상자의 클래스 이름은 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 함수를 사용하는 것도 나쁘지 않다.

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