본문 바로가기

Programming/MFC

DDX

출처 사장님! 고향이 어디세요? | ryudk01
원문 http://blog.naver.com/ryudk01/120007925973


DDX(대화 상자 데이터 교환)를 사용하면 대화 상자의 컨트롤과 대화 상자 개체의 멤버 변수 사이에 훨씬 쉽게 데이터를 교환할 수 있습니다. 데이터 교환은 양방향으로 동작합니다. 대화 상자의 컨트롤을 초기화하기 위해 사용자가 대화 상자 개체의 데이터 멤버 값을 설정하면 프레임워크는 대화 상자가 표시되기 전에 컨트롤에 이 값들을 전송합니다. 그런 다음 언제든지 사용자가 입력한 데이터로 대화 상자 데이터 멤버를 업데이트할 수 있습니다. 이 때 데이터 멤버 변수를 참조하여 데이터를 사용할 수 있습니다.

DDV(대화 상자 데이터 유효성 검사)를 사용하여 대화 상자 컨트롤의 값이 유효한지 자동으로 검사할 수 있습니다.

DDX와 DDV는 대화 상자 데이터 교환 및 유효성 검사에서 자세히 설명합니다.

모달 대화 상자의 경우 DoModal이 IDOK를 반환하고 대화 상자 개체가 소멸되기 전에만 사용자가 입력한 모든 데이터를 검색할 수 있습니다. 모덜리스 대화 상자의 경우 인수를 TRUE로 설정하여 UpdateData를 호출한 다음 대화 상자 클래스 멤버 변수에 액세스하여 언제든지 대화 상자 개체에서 데이터를 검색할 수 있습니다. 이 내용은 대화 상자 데이터 교환 및 유효성 검사에서 자세히 설명합니다.

DDX 메커니즘을 사용하는 경우 일반적으로 OnInitDialog 처리기 또는 대화 상자 생성자에서 대화 상자 개체의 멤버 변수 초기 값을 설정합니다. 대화 상자가 표시되기 바로 전에 프레임워크의 DDX 메커니즘은 멤버 변수의 값을 대화 상자의 컨트롤에 전송하며 이들은 DoModal 또는 Create에 응답하여 대화 상자가 나타날 때 표시됩니다. CDialog에서 OnInitDialog의 기본 구현은 CWnd 클래스의 UpdateData 멤버 함수를 호출하여 대화 상자의 컨트롤을 초기화합니다.

동일한 메커니즘은 사용자가 확인 단추를 클릭하면(또는 인수를 TRUE로 설정하여 UpdateData 멤버 함수를 호출할 때마다) 컨트롤의 값을 멤버 변수로 전송합니다. 대화 상자 데이터 유효성 검사 메커니즘은 유효성 검사 규칙을 지정한 모든 데이터 항목의 유효성을 확인합니다.

다음 그림은 대화 상자 데이터 교환을 설명합니다.

대화 상자 데이터 교환

UpdateData는 전달된 BOOL 매개 변수에서 지정한 대로 양방향으로 실행됩니다. 교환을 수행하기 위해 UpdateData는 CDataExchange 개체를 설정하고 CDialog의 DoDataExchange 멤버 함수의 대화 상자 클래스 재정의를 호출합니다. DoDataExchange는 CDataExchange 형식의 인수를 사용합니다. UpdateData에 전달된 CDataExchange 개체는 교환 방향 같은 정보를 정의하여 교환의 컨텍스트를 나타냅니다.

사용자(또는 코드 마법사)가 DoDataExchange를 재정의하는 경우 각 데이터 멤버(컨트롤)마다 하나의 DDX 함수 호출을 지정합니다. 각 DDX 함수는 UpdateData에 의해 DoDataExchange에 전달된 CDataExchange 인수가 제공하는 컨텍스트에 따라 양방향으로 데이터를 교환하는 방법을 알고 있습니다.

MFC는 여러 종류의 교환이 가능하도록 많은 DDX 함수를 제공합니다. 다음 예제에서는 DDX 함수 두 개와 DDV 함수 하나가 호출될 때 DoDataExchange 재정의를 보여 줍니다.

void CMyDialog::DoDataExchange(CDataExchange* pDX)
{

CDialog::DoDataExchange(pDX); // Call base class version
DDX_Check(pDX, IDC_MY_CHECKBOX, m_bVar);
DDX_Text(pDX, IDC_MY_TEXTBOX, m_strName);
DDV_MaxChars(pDX, m_strName, 20);
}
DDX_ 및 DDV_ 줄은 데이터 맵입니다. 표시된 샘플 DDX 및 DDV 함수는 각각 check-box 컨트롤과 edit-box 컨트롤에 해당합니다.

사용자가 모달 대화 상자를 취소하면 OnCancel 멤버 함수는 대화 상자를 종료하고 DoModal은 값 IDCANCEL을 반환합니다. 이런 경우 대화 상자와 대화 상자 개체 사이에 데이터가 교환되지 않습니다.

source : Microsoft C++ 설명