TN026: DDX 및 DDV 루틴

참고 항목

다음 기술 노트는 온라인 설명서에 먼저 포함되어 있었으므로 업데이트되지 않았습니다. 따라서 일부 절차 및 항목은 만료되거나 올바르지 않을 수 있습니다. 최신 정보를 보려면 온라인 설명서 색인에서 관심 있는 항목을 검색하는 것이 좋습니다.

이 참고에서는 DDX(대화 상자 데이터 교환) 및 DDV(대화 상자 데이터 유효성 검사) 아키텍처에 대해 설명합니다. 또한 DDX_ 또는 DDV_ 프로시저를 작성하는 방법과 루틴을 사용하도록 ClassWizard를 확장하는 방법에 대해서도 설명합니다.

대화 상자 데이터 교환 개요

모든 대화 상자 데이터 함수는 C++ 코드로 수행됩니다. 특별한 리소스나 매직 매크로는 없습니다. 메커니즘의 핵심은 대화 상자 데이터 교환 및 유효성 검사를 수행하는 모든 대화 상자 클래스에서 재정의되는 가상 함수입니다. 이 형식은 항상 다음과 같습니다.

void CMyDialog::DoDataExchange(CDataExchange* pDX)
{
    CDialog::DoDataExchange(pDX);   // call base class

    //{{AFX_DATA_MAP(CMyDialog)
        <data_exchange_function_call>
        <data_validation_function_call>
    //}}AFX_DATA_MAP
}

특수 형식 AFX 주석을 사용하면 ClassWizard가 이 함수 내에서 코드를 찾아 편집할 수 있습니다. ClassWizard와 호환되지 않는 코드는 특수 형식 주석 외부에 배치해야 합니다.

위의 예제 <에서 data_exchange_function_call> 형식입니다.

DDX_Custom(pDX, nIDC, field);

및 <data_validation_function_call> 선택 사항이며 형식입니다.

DDV_Custom(pDX, field, ...);

DoDataExchange 함수에 둘 이상의 DDX_/DDV_ 쌍이 포함될 수 있습니다.

MFC와 함께 제공되는 모든 대화 상자 데이터 교환 루틴 및 대화 상자 데이터 유효성 검사 루틴 목록은 'afxdd_.h'를 참조하세요.

대화 상자 데이터는 클래스의 멤버 데이터일 CMyDialog 뿐입니다. 구조체 또는 유사한 항목에 저장되지 않습니다.

주의

이 "대화 데이터"라고 하지만 모든 기능은 파생된 모든 클래스에서 CWnd 사용할 수 있으며 대화로만 제한되지 않습니다.

데이터의 초기 값은 표준 C++ 생성자에서 설정되며, 일반적으로 주석과 //}}AFX_DATA_INIT 함께 //{{AFX_DATA_INIT 블록에 설정됩니다.

CWnd::UpdateData 는 호출 DoDataExchange에 대한 초기화 및 오류 처리를 수행하는 작업입니다.

언제든지 호출 CWnd::UpdateData 하여 데이터 교환 및 유효성 검사를 수행할 수 있습니다. 기본적으로 UpdateData(TRUE)는 기본 CDialog::OnOK 처리기에서 호출되고 UpdateData(FALSE)는 기본값 CDialog::OnInitDialog으로 호출됩니다.

DDV_ 루틴은 해당 필드에 대한 DDX_ 루틴을 즉시 따라야 합니다.

작동 방식

대화 상자 데이터를 사용하려면 다음을 이해할 필요가 없습니다. 그러나 백그라운드에서 이 작업이 어떻게 작동하는지 이해하면 사용자 고유의 교환 또는 유효성 검사 절차를 작성하는 데 도움이 됩니다.

DoDataExchange 멤버 함수는 멤버 함수와 매우 유사 Serialize 합니다. 클래스의 멤버 데이터에서 외부 형식(이 경우 대화 상자의 컨트롤)에 데이터를 가져오거나 설정하는 작업을 담당합니다. pDX 매개 변수는 데이터 교환을 수행하기 위한 컨텍스트이며 매개 변수CObject::Serialize와 비슷합니다CArchive. pDX(CDataExchange개체)에는 방향 플래그가 있는 것과 매우 유사한 CArchive 방향 플래그가 있습니다.

  • 이면 !m_bSaveAndValidate데이터 상태를 컨트롤에 로드합니다.

  • 이면 m_bSaveAndValidate컨트롤에서 데이터 상태를 설정합니다.

유효성 검사는 설정된 경우에만 발생합니다 m_bSaveAndValidate . 값 m_bSaveAndValidate 은 BOOL 매개 변수에 의해 결정됩니다 CWnd::UpdateData.

다른 세 가지 흥미로운 CDataExchange 멤버가 있습니다.

  • m_pDlgWnd: 컨트롤이 포함된 창(일반적으로 대화 상자)입니다. 이는 DDX_ 및 DDV_ 전역 함수의 호출자가 모든 DDX/DDV 루틴에 'this'를 전달하지 못하도록 하기 위한 것입니다.

  • PrepareCtrlPrepareEditCtrl: 데이터 교환을 위한 대화 상자 컨트롤을 준비합니다. 유효성 검사에 실패할 경우 포커스를 설정하기 위한 컨트롤의 핸들을 저장합니다. PrepareCtrl 는 편집되지 않은 컨트롤에 사용되며 PrepareEditCtrl 편집 컨트롤에 사용됩니다.

  • Fail: 사용자에게 입력 오류를 알리는 메시지 상자를 표시한 후 호출됩니다. 이 루틴은 마지막 컨트롤(마지막 호출 또는 PrepareEditCtrl호출)에 포커스를 PrepareCtrl 복원하고 예외를 throw합니다. 이 멤버 함수는 DDX_ 루틴과 DDV_ 루틴 모두에서 호출될 수 있습니다.

사용자 확장

기본 DDX/DDV 메커니즘을 확장하는 방법에는 여러 가지가 있습니다. 마케팅 목록의 구성원을 관리할 수 있습니다.

  • 새 데이터 형식을 추가합니다.

    CTime
    
  • 새 교환 프로시저(DDX_)를 추가합니다.

    void PASCAL DDX_Time(CDataExchange* pDX, int nIDC, CTime& tm);
    
  • 새 유효성 검사 절차(DDV_)를 추가합니다.

    void PASCAL DDV_TimeFuture(CDataExchange* pDX, CTime tm, BOOL bFuture);
    // make sure time is in the future or past
    
  • 임의의 식을 유효성 검사 프로시저에 전달합니다.

    DDV_MinMax(pDX, age, 0, m_maxAge);
    

    참고 항목

    이러한 임의 식은 ClassWizard에서 편집할 수 없으므로 특수 형식 주석(//{{AFX_DATA_MAP(CMyClass)) 외부로 이동해야 합니다.

멤버 함수에 DoDataExchange 조건부 또는 다른 유효한 C++ 문이 혼합된 교환 및 유효성 검사 함수 호출을 포함하도록 합니다.

//{{AFX_DATA_MAP(CMyClass)
DDX_Check(pDX, IDC_SEX, m_bFemale);
DDX_Text(pDX, IDC_EDIT1, m_age);
//}}AFX_DATA_MAP
if (m_bFemale)
    DDV_MinMax(pDX, age, 0, m_maxFemaleAge);
else
    DDV_MinMax(pDX, age, 0, m_maxMaleAge);

참고 항목

위에 표시된 것처럼 이러한 코드는 ClassWizard에서 편집할 수 없으며 특수 형식 주석 외부에서만 사용해야 합니다.

ClassWizard 지원

ClassWizard는 고유한 DDX_ 및 DDV_ 루틴을 ClassWizard 사용자 인터페이스에 통합할 수 있도록 하여 DDX/DDV 사용자 지정의 하위 집합을 지원합니다. 이 작업은 프로젝트 또는 많은 프로젝트에서 특정 DDX 및 DDV 루틴을 다시 사용하려는 경우에만 비용이 유용합니다.

이를 위해 DDX.CLW(이전 버전의 Visual C++에서 이 정보를 APSTUDIO에 저장)로 특수 항목이 만들어집니다. INI) 또는 프로젝트의 . CLW 파일입니다. 특수 항목은 프로젝트의 [일반 정보] 섹션에 입력할 수 있습니다. CLW 파일 또는 \Program Files\Microsoft Visual Studio\Visual C++\bin 디렉터리에 있는 DDX.CLW 파일의 [ExtraDDX] 섹션에 있습니다. DDX.CLW 파일이 아직 없는 경우 만들어야 할 수 있습니다. 특정 프로젝트에서만 사용자 지정 DDX_/DDV_ 루틴을 사용하려는 경우 프로젝트의 [일반 정보] 섹션에 항목을 추가합니다. 대신 CLW 파일입니다. 많은 프로젝트에서 루틴을 사용하려는 경우 DDX.CLW의 [ExtraDDX] 섹션에 항목을 추가합니다.

이러한 특수 항목의 일반적인 형식은 다음과 같습니다.

ExtraDDXCount=n

여기서 n 은 양식의 ExtraDDX 수인가요? 따라야 할 줄 수입니다.

ExtraDDX?=keys; vb-keys; 프롬프트; type; initValue; DDX_Proc [; DDV_Proc; prompt1; arg1 [; prompt2; fmt2]]

여기서 ? 는 숫자 1입니다 . 정의되는 목록에 있는 DDX 형식을 나타내는 n 입니다.

각 필드는 ';' 문자로 구분됩니다. 필드 및 해당 용도는 아래에 설명되어 있습니다.

  • keys

    이 변수 형식을 제어하는 대화 상자를 나타내는 단일 문자 목록입니다.

    캐릭터 허용되는 컨트롤
    E edit
    C 2개 상태 검사 상자
    c tri-state 검사 box
    R 그룹의 첫 번째 라디오 단추
    L 정렬되지 않은 목록 상자
    l 정렬된 목록 상자
    M 콤보 상자(편집 항목 포함)
    N 정렬되지 않은 드롭 목록
    n 정렬된 드롭 목록
    1 DDX 삽입을 목록의 헤드에 추가해야 하는 경우(기본값은 tail에 추가됨) 일반적으로 'Control' 속성을 전송하는 DDX 루틴에 사용됩니다.
  • vb-keys

    이 필드는 VBX 컨트롤의 16비트 제품에서만 사용됩니다(VBX 컨트롤은 32비트 제품에서 지원되지 않음).

  • prompt

    속성 콤보 상자에 배치할 문자열(따옴표 없음)

  • type

    헤더 파일에서 내보낸 형식에 대한 단일 식별자입니다. 위의 DDX_Time 예제에서는 CTime으로 설정됩니다.

  • vb-keys

    이 버전에서는 사용되지 않으며 항상 비어 있어야 합니다.

  • initValue

    초기 값 - 0 또는 비어 있습니다. 비어 있으면 구현 파일의 //{{AFX_DATA_INIT 섹션에 초기화 줄이 작성되지 않습니다. 올바른 초기화를 보장하는 생성자가 있는 C++ 개체(예: CStringCTime등)에 빈 항목을 사용해야 합니다.

  • DDX_Proc

    DDX_ 프로시저의 단일 식별자입니다. C++ 함수 이름은 "DDX_"로 시작해야 하지만 DDX_Proc 식별자에 "DDX_"<>을 포함하지 않아야 합니다. 위의 <예제에서 DDX_Proc> 식별자는 Time입니다. ClassWizard가 {{AFX_DATA_MAP 섹션의 구현 파일에 함수 호출을 쓰면 이 이름을 DDX_ 추가하여 DDX_Time 도착합니다.

  • comment

    이 DDX를 사용하여 변수에 대한 대화 상자에 표시할 주석입니다. 여기에 원하는 텍스트를 배치하고 일반적으로 DDX/DDV 쌍에서 수행하는 작업을 설명하는 항목을 제공합니다.

  • DDV_Proc

    항목의 DDV 부분은 선택 사항입니다. 모든 DDX 루틴에 해당 DDV 루틴이 있는 것은 아닙니다. 종종 유효성 검사 단계를 전송의 필수적인 부분으로 포함하는 것이 더 편리합니다. ClassWizard는 매개 변수 없이 DDV 루틴을 지원하지 않으므로 DDV 루틴에 매개 변수가 필요하지 않은 경우가 종종 있습니다.

  • arg

    DDV_ 프로시저의 단일 식별자입니다. C++ 함수 이름은 "DDV_"로 시작해야 하지만 DDX_Proc 식별자에 "DDX_>"<을 포함하지 않습니다.

    인수 뒤에 1개 또는 2개의 DDV 인수가 잇습니다.

    • promptN

      편집 항목 위에 배치할 문자열(가속기용 & 포함)입니다.

    • fmtN

      arg 형식의 형식 문자( 다음 중 하나)

      캐릭터 Type
      d int
      u 부호 없는 정수
      D long int(즉, long)
      U long unsigned(즉, DWORD)
      f float
      F double
      s string

참고 항목

번호별 기술 참고 사항
범주별 기술 참고 사항