더북(TheBook)

지금까지 세 개의 컨트롤에 대해 멤버 변수를 추가하였다. 멤버 변수 추가 마법사를 이용하여 추가된 멤버 변수들은 각각 FileNewDLG.h 파일과 FileNewDLG.cpp 파일에 소스 코드의 형태로 자동으로 입력이 된다. 소스 5-7은 FileNewDLG.h 파일에 자동적으로 추가된 변수 선언을 보기 좋게 정리한 코드이고, 소스 5-8은 FileNewDLG.cpp 파일에서 변화된 코드만 나타낸 것이다.

소스 5-7 컨트롤에 대한 멤버 변수가 추가된 FileNewDlg.h 파일(FileNewDlg.h)
class CFileNewDlg : public CDialogEx
{
    
public:
    // 이미지 가로, 세로 크기
    int m_nWidth;
    int m_nHeight;

    // 이미지 색상 타입(0: 그레이스케일, 1: 트루컬러)
    int m_nType;
};
소스 5-8 컨트롤에 대한 멤버 변수가 추가된 FileNewDlg.cpp 파일(FileNewDlg.cpp)
CFileNewDlg::CFileNewDlg(CWnd* pParent /*=NULL*/)
    : CDialogEx(IDD_FILE_NEW, pParent)
    , m_nWidth(256)
    , m_nHeight(256)
    , m_nType(0)
{
}

…
void CFileNewDlg::DoDataExchange(CDataExchange* pDX)
{
    CDialogEx::DoDataExchange(pDX);
    DDX_Text(pDX, IDC_WIDTH, m_nWidth);
    DDV_MinMaxInt(pDX, m_nWidth, 1, 4096);
    DDX_Text(pDX, IDC_HEIGHT, m_nHeight);
    DDV_MinMaxInt(pDX, m_nHeight, 1, 4096);
    DDX_CBIndex(pDX, IDC_IMAGE_TYPE, m_nType);
}

소스 5-8에서 조금 생소한 코드는 DoDataExchange 함수일 것이다. DoDataExchange 함수는 대화 상자 컨트롤과 CFileNewDlg 클래스의 멤버 변수 간의 데이터를 서로 교환해주는 역할을 한다. 예를 들어 IDC_NEW_WIDTH 아이디를 가진 에디트 컨트롤에 m_nWidth라는 멤버 변수를 만들어주면 다음과 같은 코드가 추가된다.

DDX_Text(pDX, IDC_NEW_WIDTH, m_nWidth);

DoDataExchange 함수 내부에 있는 DDX_Text() 또는 DDX_CBIndex() 등의 매크로 함수는 대화 상자의 컨트롤에 적혀 있는 값과 멤버 변수의 값을 서로 교환해주는 역할을 하며, DDV_MinMaxInt() 매크로 함수는 최솟값 또는 최댓값을 설정하는 역할을 한다. DoDataExchange 함수의 코드는 모두 멤버 변수 추가 마법사가 자동으로 생성해주는 코드이며 사용자에게 친숙한 코드도 아니므로 이 함수 내부는 임의로 변경하지 않는 것이 좋다.

대화 상자 클래스에 멤버 변수를 추가하면 클래스의 생성자 함수에 멤버 변수의 초기화 코드가 추가된다. 기본적으로 int형으로 선언한 변수는 모두 0으로 초기화된다. 그러나 m_nWidthm_nHeight가 새로 만들 영상의 가로, 세로 크기를 의미하므로 이 값을 0으로 초기화하는 것은 좋지 않다. 그러므로 소스 5-8과 같이 생성자에서 m_nWidthm_nHeight 변수의 값이 256으로 초기화되도록 수정하자. m_nType은 기본값인 0으로 초기화할 것이며, 이 경우 대화 상자가 화면에 나타날 때 자동으로 ‘그레이스케일 타입’이 선택된다.

CFileNewDlg 클래스 생성은 이로써 마무리가 되었다. 이제는 실제 ImageTool 프로그램에서 새로 만들기 메뉴를 선택했을 때, 이 클래스를 사용하여 화면에 대화 상자를 띄우는 코드를 작성하여보자.

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