MFC에서 다이얼로그 프로그램을 짤때 자동으로 생성되는
DoDataExchange 를 그냥 보고만 지나갔다면 한번쯤 봐야하는것
MFC의 기술중 하나인 DDX(dialog data exchange).
다이얼로그 기반으로 여러가지 윈도우 컨트롤러를 손쉽게 만들 수 있다.
이렇게 만들어진 다이얼로그의 컨트롤을, 변수로 사용하려고 하고싶다면
변수와, 컨트롤 사이에 값을 주고받는 일이 일어나야 한다.
ex)
다이얼로그위에 Edit Control(글씨 쓸수있는 칸)을 그리고, 속성에서 ID이름을
IDC_MYEDIT으로 줬다고 치자.
이 IDC_MYEDIT에 어떤 문자를 써서 변수로 받고 싶거나
어떤 스트링 값을 IDC_MYEDIT에 넣고 싶다면 반드시 값 교환이 일어나야 한다.
이를 위해서 지원하는 함수가 바로 GetDlgItem함수 시리즈
GetDlgItemText(IDC_MYEDIT, m_str); //IDC_MYEDIT의 값을 문자열 형태로 m_str에 저장
GetDlgItemInt(IDC_MYEDIT, m_nVal); //위에 함수와 비슷하지만 정수형태로 받음
반대로 어떤 변수의 값을 IDC_MYEDIT에 넣고 싶을때는 SetDlgItem함수 시리즈
SetDlgItemText(IDC_MYEDIT, m_str); //m_str 변수의 값을 IDC_MYEDIT에 넣음
SetDlgItemInt(IDC_MYEDIT, m_nVal); //위와 값은 원리로 정수값을 대입
이런 작업을 해야 컨트롤과 변수간에 값 교환이 일어나게 된다. 컨트롤이 많아지면 이것 또한 기계적인 작업이 되게 된다. 이를 위해서 MFC에서는 이걸 자동으로 해준다.
그것이 바로
UpdateData(TRUE); 와
UpdateData(FALSE); 이다.
TRUE 주면 컨트롤에서 -> 변수로 값을 가져옴
FALSE로 주면 변수에서 -> 컨트롤로 값을 전달해줌
이것을 DDX( Dailog data exchange) 라고 한다.
단 이것을 하기 위해서는 Dialog 클레스에 기본적으로 들어가있는 함수인 DoDataExchange()함수에 컨트롤과 그에 상응시키고자 하는 변수가 등록되어 있어야 한다.
이런 식으로
DoDataExchange(CDataExchange *pDX)
{ DDX_Text(pDX, IDC_MYEDIT, m_str);
}
이 함수는 다이얼로그 생성해서 클레스 추가하면 자동으로 생긴다.
하지만 이것도 불편하다면 그걸 위해서 컨트롤에 가서 오른쪽 버튼을 누른뒤에 변수추가를 누르면 해당하는 컨트롤러에 변수를 넣을 수가 있다. 변수추가 화면에서 범주(영문판에서는Category) 에 value로 선택하면 우리가 사용하기에 익숙한, int, CString 등으로 컨트롤러를 변수추가 할수있는데 이 변수추가 마법사에 의해서 생긴 변수는 자동으로 DoDataExchange 함수에 등록이 되기 때문에 이렇게 추가된 변수는 그냥 UpdateData(true or false); 만으로 값을 적용시키거나 가져올수 있다.
DoDataExchange 함수에 대해서 알아본 김에
팁으로 DDV(Dailog data validation)까지 알아보자.
DDV 말 그대로 validation! 유효값을 설정해주는 기능이다
DDV는 한도값을 설정하는 기능을 한다.
에디트컨트롤에 정수값으로 0~255까지만 입력받고 싶다거나
에디트컨트롤에 문자열을 20자 내로 쓰게 하고 싶고, 이외의 입력은 오류처리하고싶다면
애써서 if문 써가며 할 필요 없이 mfc 에서 지원하는 DDV기능을 사용하면 자동으로 구현된다.
방법) DDX 함수로 가서 내용을 추가한다
DoDataExchange(CDataExchange *pDX)
{
DDX_Text(pDX, IDC_MYEDIT, m_str);//위에서 언급했음. IDC_STR과 m_str변수와 연결시킴
DDX_Text(pDX, IDC_MYCOLOR, m_color); //IDC_MYCOLOR와 m_color변수와 연결시킴
//아래코드 m_str 즉 IDC_MYEDIT 칸에는 20자이상 입력시 메시지박스형태로 오류를 출력해준다
DDV_MaxChars(pDX, m_str, 20);
//위와 같은 원리로 m_color즉 IDC_MYCOLOR 칸에는 정수 0~255외의 값을 입력시 오류냄
DDV_MinMaxInt(pDX, m_color, 0, 255 );
}
UpdateData(true of false);
1번과정이 FALSE
2번과정이 TRUE