본문 바로가기
Program/C++ MFC

[C++ MFC] UpdateData() 함수 사용하는 이유 / 사용하는 방법

by 냠만 2024. 6. 25.

[UpdateData 함수]

이 함수는 MFC를 개발하면 필수적으로 알고 있어야 하는 함수입니다. 보통 C#이나 다른 언어는 이벤트, 비동기 시퀀스, 바인딩을 거치면 별도로 업데이트를 진행하지 않아도 변수와 컨트롤이 연동되어 데이터가 자동으로 갱신되는데 MFC는 직접 업데이트를 지시해야만 연동이 될 수 있습니다.

참으로 불편하기 그지없지만 C# 내부코드로 들어가보면 비동기나 이벤트 등도 모두 Update와 같은 시퀀스를 내포하고 있음을 알 수 있습니다.

 

일단 별로 알고싶진 않지만 함수 원형은 알고 있어야 합니다.

BOOL UpdateData (BOOL bSaveAndValidate = TRUE);

함수 원형에서 알 수 있듯 리턴은 Boolean 변수로 나오고 요구하는 인자도 역시 Boolean 타입인 걸 알 수 있습니다.

 

[UpdateData 함수 의미]

UpdateData 함수는 내부적으로 DoDataExchange() 함수를 강제적으로 호출해 주는 함수입니다. Dialog를 만들면. cpp파일 내부에 위 함수가 존재하는 걸 확인할 수 있습니다. 보통 Dialog에서 컨트롤을 만들고 해당 컨트롤에 변숫값을 부여하면 DoDataExchange() 함수로 해당 컨트롤과 변수가 엮이는 걸 확인할 수 있습니다.

즉 윈도우에서 해당 함수를 불러서 컨트롤의 값과  설정된 변수의 값을 동기화하지 못할 때 직접적으로 호출하여 접근할 수 있도록 도와주는 함수입니다.

기본값을 TRUE로 설정되어 있습니다.

 

UpdateData(TRUE)는 함수 원형과 같이 SaveAndValidate에 TRUE값을 넣어 현재 컨트롤에 적힌 값을 변수로 넣어줍니다.

UpdateData(FALSE)는 반대로 변수에 적힌 값을 컨트롤에 넣어줍니다.

 

처음 접하면 좀 헷갈리기 때문에 UpdateData함수를 적어놓고 F12를 눌러 정의로 이동하여 함수 원형을 지속적으로 봐주시는 게 기억하는데 도움이 됩니다.

 

**참고로 C++에서는 C#과 다르게 bool변수를 대문자로 사용하는데, 그 이유는 afx.h에 define되어 있는 값이기 때문이며 통일성을 유지하기 위해서입니다. FALSE는 int로 0 값 TRUE는 int로 1 값을 의미합니다. 

 

물론 UpdateData를 활용하기 위해서는 Control과 변수를 묶어주는 작업이 DoDataExchange()함수에 정의되어 있어야 합니다.

 

정리하자면 Dialog에 선언된 EditBox에서 데이터를 가져오는 방법은 두가지가 있습니다.

1. GetDlgItem에서 Resource.h에 선언된 nID를 기준으로 데이터를 읽어오는 방법

2. DoDataExchange()에 Control과 변수를 엮어서 UpdateData(TRUE)를 활용하는 방법

 

두 가지 모두 쓰이는 경우가 다르기 때문에 반드시 알고 있어야 하는 방법들입니다.

 

[UpdateData 함수 활용]

다이어로그에서 직접 EditBox를 생성하고 변수를 부여하며 확인하는 방법입니다. 위에 설명된 2번 방법으로 테스트 진행하는 과정을 보여드리겠습니다. 참고하시면 될 것 같습니다.

Dialog변수 생성

Dialog에서 EditBox를 생성하고 우클릭으로 변수를 추가합니다.

 

변수 옵션 설정

변수 형식과 변수 이름을 설정하고 범주를 반드시 Value로 변경합니다. 변경하지 않으면 정상적으로 동작하지 않습니다.

버튼생성 및 코드 설정

각 버튼을 생성하고 코드를 할당하는 작업을 진행합니다. 각 버튼마다 동작하는 내용을 다르게 설정합니다.

1. 붉은색 버튼 : 위에서 설정한 EditBox에 할당된 변수(m_Text)의 값에 어떤 값이 들어가 있는지 확인합니다.

2. 하늘색 버튼 : 컨트롤의 값을 변수에 넣습니다. (UpdateData(TRUE))

3. 주황색 버튼 : 변수 값을 컨트롤에 넣습니다 (UpdateData(FALSE))

4. 초록색 버튼 : EditBox에 할당된 변수 (m_Text)의 값을 Background에서 변경합니다.

 

 

변수 내용 불러오기

위와 같이 설정했으면 버튼을 순서대로 누릅니다. EditBox에 문자를 넣고 바로 변숫값을 불러와보면 m_Text는 비어있는 걸 확인할 수 있습니다.

 

업데이트 사용

m_Text값이 비어있는 상태에서 UpdateData(TRUE)로 컨트롤의 값을 변수에 대입해 주면 적용된 값을 불러올 수 있는 것을 확인할 수 있습니다.

변경된 변수 내용 불러오기

이미 m_Text에는 RandomValue가 String값으로 들어가 있습니다. 이 상태에서 1번에 Change 버튼을 클릭하여 m_Text변수의 내용을 RandomValue_Change로 변경하고 m_Text변숫값을 불러와 봅니다.

위와 같이 변숫값은 변경되었지만 EditBox에는 해당 값이 적용되지 않았음을 확인할 수 있습니다.

 

변수 내용 컨트롤 적용

마지막으로 UpdateData(FALSE)를 클릭하여 변수와 컨트롤의 내용을 동기화하면 EditBox에 m_Text의 값이 적용되는 걸 확인할 수 있습니다. 

 

마지막으로 정리하자면 아래와 같습니다.

UpdateData(TRUE)는 현재 컨트롤에 적힌 값을 변수로 넣어줍니다.

UpdateData(FALSE)는 반대로 변수에 적힌 값을 컨트롤에 넣어줍니다.