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
출처 : http://ruony.net/wiki/doku.php/mfc_ddx_updatedata
'OpenSTUDY > MFC' 카테고리의 다른 글
Edit Control에 text 삽입 (0) | 2011.11.11 |
---|---|
ShellExecute (0) | 2011.11.05 |
WinExec (0) | 2011.11.05 |
LPSTR, LPCSTR, LPTSTR, LPCTSTR, LPWSTR,LPCWSTR (0) | 2011.10.08 |
MFC base (0) | 2011.10.06 |