더북(TheBook)

그럼 실제로 산술 및 논리 연산 대화 상자의 콤보 박스에 도큐먼트 목록를 추가하는 코드를 작성해보자. 이러한 코드는 대화 상자의 초기화를 담당하는 OnInitDialog 함수에 추가하는 것이 바람직하다. OnInitDialog 함수는 클래스 마법사를 이용하여 가상 함수 재정의를 해주어야 생성되는 함수이다. OnInitDialog 함수를 추가하는 방법에 대해서는 6.2절을 참고하기 바란다. OnInitDialog 함수에 추가할 소스 코드는 소스 7-9에 나타내었다.

소스 7-9 도큐먼트 리스트를 콤보 박스에 추가하기(ArithmeticLogicalDlg.cpp)
#include "ImageToolDoc.h"

BOOL CArithmeticLogicalDlg::OnInitDialog()
{
    CDialogEx::OnInitDialog();

    // 콤보 박스에 차일드 윈도우 창의 이름을 삽입
    int nIndex = 0;
    CString strTitle;

    CImageToolApp* pApp = (CImageToolApp*)AfxGetApp();
    POSITION pos = pApp->m_pImageDocTemplate->GetFirstDocPosition();

    while (pos != NULL)
    {
        CImageToolDoc* pDoc = (CImageToolDoc*)pApp->m_pImageDocTemplate->GetNextDoc(pos);
        if (pDoc->m_Dib.GetBitCount() != 8)
            continue;

        strTitle = pDoc->GetTitle();

        m_comboImage1.InsertString(nIndex, strTitle);
        m_comboImage2.InsertString(nIndex, strTitle);

        m_comboImage1.SetItemDataPtr(nIndex, (void*)pDoc);
        m_comboImage2.SetItemDataPtr(nIndex, (void*)pDoc);

        nIndex++;
    }

    m_comboImage1.SetCurSel(0);
    m_comboImage2.SetCurSel(0);
    if (nIndex > 1) m_comboImage2.SetCurSel(1);

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

소스 7-9를 보면 OnInitDialog 내부에서 while 루프를 이용하여 도큐먼트 템플릿에 연결된 모든 도큐먼트에 접근하고 있다. 만약 ImageToolDoc 클래스가 가지고 있는 DIB 영상이 그레이스케일 영상이 아니면 콤보 박스에 추가하지 않는다. 만약 그레이스케일 영상을 가지고 있는 도큐먼트라면 GetTitle 함수를 이용하여 도큐먼트 이름을 받아와 콤보 박스에 추가한다. 도큐먼트의 이름은 차일드프레임 창의 타이틀 바에 씌어진 이름과 같다. 그리고 SetItemDataPtr 함수를 이용하여 도큐먼트의 포인터 값을 콤보 박스에 같이 저장하였다. while 루프 바깥에서는 콤보 박스에 들어가 있는 도큐먼트 리스트 중에서 가장 첫 번째 또는 두 번째 도큐먼트를 기본으로 선택하도록 SetCurSel 함수를 사용하였다.

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