이 노트에서는 대화 상자 데이터 교환 (DDX) 및 대화 데이터 유효성 검사 (DDV) 아키텍처에 설명합니다. 또한 DDX_ 또는 DDV_ 프로시저를 작성 하는 방법 및 귀하의 루틴을 사용 하 여 마법사를 확장 하는 방법을 설명 합니다.
대화 상자 데이터 교환의 개요
모든 대화 데이터 함수는 c + + 코드와 함께 완료 됩니다. 거기에 특별 한 자원 또는 마법의 매크로. 메커니즘의 중심은 대화 데이터 교환 및 유효성 검사를 모든 대화 상자 클래스에서 재정의 되는 가상 함수입니다. 그것은 항상이 양식에서 발견:
void CMyDialog::DoDataExchange (CDataExchange * pDX)
{
nbsp;? CDialog::DoDataExchange(pDX);??? / / 기본 클래스 호출
//{{AFX_DATA_MAP(CMyDialog)
?????? <data_exchange_function_call>
??????
?? //}}AFX_DATA_MAP
}
특별 한 형식 AFX 의견 허용 Classwizard를 찾아이 함수 내의 코드를 편집 합니다. 코드 마법사와 호환 되지 않는 특수 형식 의견의 외부 배치 되어야 합니다.
위의 예에서 lt; data_exchange_function_call > 형태입니다:
nbsp;???DDX_Custom (pDX, nIDC, 필드)(&N)
그리고 lt; data_validation_function_call > 선택적 이며 형태로:
nbsp;???DDV_Custom (pDX, 필드,...)(&N)
하나 이상의 DDX_/DDV_ 쌍 각 DoDataExchange 함수에 포함 될 수 있습니다.
모든 대화 상자 데이터 교환 루틴 및 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 매개 변수 데이터를 교환 하 고 컨텍스트 이며 CArchive 매개 변수 CObject::Serialize를 비슷합니다. PDX ( CDataExchange 개체)는 방향 플래그가 CArchive 있다 방향 플래그 처럼
유효성 검사는 m_bSaveAndValidate 을 설정 하는 경우에 발생 합니다. M_bSaveAndValidate 의 값 CWnd::UpdateData 를 BOOL 매개 변수에 의해 결정 됩니다.
거기에 세 가지 다른 흥미로운 CDataExchange 멤버:
사용자 확장
여러 가지 방법으로 기본 DDX/DDV 메커니즘을 확장할 수 있습니다. 당신은 할 수 있어요:
CTime
void 파스칼 DDX_Time(CDataExchange* pDX, int nIDC, CTimeamp; tm)(&A)
void 파스칼 DDV_TimeFuture(CDataExchange* pDX, CTime tm, BOOL bFuture);
/ / 시간은 미래 또는 과거에 있는지 확인 하십시오.
DDV_MinMax (pDX, 나이, 0, m_maxAge)
메모nbsp;??이러한 임의 식 Classwizard는 편집할 수 없습니다 및 따라서 특별 한 형식 의견 (//{{afx_data_map(cmyclass))의 외부 이동 해야(&N)。
조건 문이나 모든 다른 유효한 c + + intermixed 교환 및 유효성 검사 함수 호출을 포함 하는 DoDialogExchange 멤버 함수를가지고。
//{{AFX_DATA_MAP(CMyClass)
DDX_Check (pDX, IDC_SEX, m_bFemale);
DDX_Text (pDX IDC_EDIT1, m_age);
//}}AFX_DATA_MAP
경우 (m_bFemale)
nbsp;? DDV_MinMax (pDX, 나이, 0, m_maxFemaleAge);
다른
?? DDV_MinMax (pDX, 나이, 0, m_maxMaleAge)(&N)
메모nbsp;??위에서 보는 바와 같이, 이러한 코드 ClassWizard 편집할 수 없습니다 하 고 특별 한 형식 댓글만 외부의 사용 해야(&N)。
ClassWizard 지원
ClassWizard 자신의 DDX_ 및 DDV_ 루틴 ClassWizard 사용자 인터페이스에 통합할 수 있도록 함으로써 DDX/DDV 사용자의 하위 집합을 지원 합니다. 이렇게 하는 것은 유일한 비용 특정 DDX 및 DDV 루틴 몇 번이 고 프로젝트 또는 여러 프로젝트에서 다시 사용 하려는 경우에 유용。
이 위해 특별 한 항목 DDX에 만들어집니다.CLW (이전 버전의 Visual c + + APSTUDIO에이 정보를 저장 합니다.INI) 또는 귀하의 프로젝트에.CLW 파일입니다. 특별 한 항목이 될 수 있는 프로젝트의 [일반 정보] 섹션에 입력 합니다.CLW 파일이 나 고 DDX [ExtraDDX] 섹션에서.CLW 파일이 \program files\microsoft Visual Studio\Visual C + + \bin 디렉터리. DDX를 만들 필요가 있습니다.CLW 파일이 이미 존재 하지 않는 경우입니다. 특정 프로젝트에만 사용자 지정 DDX_/DDV_ 루틴을 사용 하려면 프로젝트의 [일반 정보] 섹션에 항목을 추가 합니다.CLW 대신 파일. 많은 프로젝트에 루틴을 사용 하려는 경우 DDX [ExtraDDX] 섹션에 항목을 추가 합니다.CLW。
이러한 특별 항목의 일반적인 형식은:
ExtraDDXCount = n
; 여기서 n은 ExtraDDX 번호? 라인을 따라
ExtraDDX? lt; = 키 >; < vb 키 >; <prompt> <type> <initValue> <DDX_Proc> [; <DDV_Proc> <prompt1> <arg1> [<prompt2> <fmt2>]]
; 어디? 정의 되 고 목록에서 DDX 유형을 나타내는 숫자 1-n을 이다。
각 필드는 ';' 문자로 구분 됩니다. 필드 및 그들의 목적은 다음과 같습니다.
lt; 키 & gt;
단일 문자는 대화 상자 컨트롤에 대 한이 변수 형식이 허용 되는지 나타내는 목록 =。
E = 편집
C = 2 상태 확인란
c = 트라이-스테이트 확인란
R = 그룹에서 첫 번째 라디오 단추
L = = 정렬 되지 않은 목록 상자
l = = 정렬된 목록 상자
M = = (편집 항목)와 콤보 상자
N = 비 정렬 드롭 목록
n = 정렬된 드롭 목록
1 = DDX 삽입 머리의 목록에 추가 해야 하는 경우 (기본값은 꼬리에 추가 됨) nbsp; 이 속성은 일반적으로 '제어' 속성을 전송 하는 DDX 루틴에 사용 됩니다(&N).
lt; vb 키 & gt;
이 필드는 VBX 컨트롤 (VBX 컨트롤은 32 비트 제품에서 지원 되지 않는)에 대 한 16 비트 제품에만 사용
lt; 프롬프트 > =
문자열 속성 콤보 상자의 (따옴표 제외)을
lt; type > =
헤더 파일에서 방출 하는 형식에 대 한 단일 식별자입니다. 우리의 예제에서 위의 ddx_time와 함께이 Ctime로 설정 됩니다.
lt; vb 키 > =
이 버전에서 사용 되지 않으며 항상 비어 있어야
lt; initValue > =
초기 값-0 또는 공백입니다. 비어 초기화 라인 구현 파일의 //{{AFX_DATA_INIT 섹션에 기록 됩니다. 올바른 초기화를 보장 하는 생성자가 있는 c + + 개체 (예: CString, CTime, 그리고 기타 등등)에 빈 항목을 사용 해야。
lt; DDX_Proc > =
dDX_ 절차에 대 한 단일 식별자입니다. C + + 함수 이름을 "DDX_,"로 시작 해야 합니다 하지만 lt; "DDX_"를 포함 하지 않습니다 DDX_Proc > 식별자. 위의 예제에서 <DDX_Proc> 식별자는 시간이 될 것 이다. Classwizard의 구현 파일에 함수 호출을 작성 하는 때를 {{AFX_DATA_MAP 섹션이이 이름을 추가 합니다 DDX_, 따라서 ddx_time에 도착。
lt; 메모 > =
이 DDX 사용 하 여 변수 대화 상자에 표시할 설명입니다. DDX/DDV 쌍에 의해 수행 되는 작업을 설명 하는 모든 텍스트를 것 처럼 여기, 일반적으로 뭔가 제공。
lt; DDV_Proc & gt;
항목의 DDV 부분 선택 사항입니다. 모든 DDX 루틴 해당 DDV 루틴 있다. 종종, 그것은 전송의 필수적인 부분으로 유효성 검사 단계를 포함 하는 것이 더 편리 합니다. 이것은 종종 사건 때 DDV 루틴 ClassWizard 매개 변수 없이 DDV 루틴을 지원 하지 않으므로 매개 변수 필요로 하지 않습니다.
= DDV_ 프로시저에 대 한 단일 식별자. C + + 함수 이름을 "DDV_"로 시작 해야 합니다 하지만 lt; "DDX_"를 포함 하지 않습니다 DDX_Proc > 식별자。
뒤에 1 개 또는 2 DDV args:
lt; promptX > =
항목 편집 (앰프와, 가속기) 위에 배치할 문자열(&A)
lt; fmtX > =
arg 유형 중 하나에 대 한 형식 문자
d = int
u = 서명
D = long int (즉, 긴)
U 긴 서명 = (DWORD)
f = 플 로트
F = 더블
s = 문자열
사용자 지정 DDX의 예
예를 들어, 유효성 검사 사용자 지정 DDX MFC 고급 개념 샘플에서 찾을 수 있습니다 CHKBOOK. DOLLCENT에서 ddx_dollarscents를 참조 하십시오.사용자 지정 DDX 루틴 및 CHKBOOK 샘플 구현에 대 한 통화 당.CLW 해당 예제 ExtraDDXCount 및 CHKBOOK의 [일반 정보] 섹션에 있는 ExtraDDX1 항목에 대 한.CLW 파일。
기술 노트 번호로 |nbsp; 카테고리별 기술 노트(&N)