자료 저장소


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

'프로그래밍 > MFC' 카테고리의 다른 글

MFC :: Tip 2  (0) 2012.02.14
MFC :: DDX / DDV (Code Project)  (0) 2011.09.29
MFC :: 맵핑모드  (0) 2011.09.15
MFC :: Tip 1  (0) 2011.09.13
MFC :: 키보드 입력 관련  (0) 2011.09.12
댓글 로드 중…

최근에 게시된 글