삽질의 현장/- MFC

#006_MFC_Control, Value형 변수

shovelman 2015. 10. 19. 16:51


안녕하세요 삽잡이입니다.


Dialog를 통해 Control에 대해서 알아보려고 합니다.

API를 통해서도 알아봤었습니다...


Dialog는 리소스에 만들어집니다.

MFC에서는 이 다이어로그를 어떻게 사용하느냐?


다이어로그는 지금까지 리소스에 만들어졌으니

가장 처음으로는 리소스가 있어야합니다.

따라서 리소스를 만드는 작업을 우선적으로 해야합니다.


기존에 API에서는 ID로 충분했지만, 

MFC에서는 해당 다이어로그를 컨트롤할 수 있는 클래스를 만들고

그 객체를 가지고 놀면 됩니다...



그리고 다음으로는 클래스를 추가하는 것입니다.

클래스를 추가하면 사용하고자하는 객체 

즉, View 클래스에 리소스에 대한 class가 추가되는 것을 확인할 수 있습니다.


 


클래스까지 생성했다면, 해당 클래스의 객체를 만들어야합니다.


다이어로그를 띄우는 것... 즉, 사용하는 것이 목적이기 때문에

객체를 만들어야하는 것이죠...


해당 다이어로그를 사용할 객체에 헤더를 포함시키고 객체를 생성하면 됩니다.

 


지금까지의 말을 정리하자면,

리소스를 만들고 리소스의 클래스를 만들고 클래스의 객체를 만들고 실행하는 것입니다.


참고로, 다이어로그가 최초에 뜰 때에는 초기화를 위해 

OnInitDialog()와 같은 메시지 핸들러 함수가 호출됩니다.


다이어로그에 대한 데이터는 

다이어로그가 지워지는 순간 없어지기 때문에 클래스의 객체를 통해 데이터를 다룰 수 있어야합니다.

즉, 다이어로그에서 값을 꺼낼 수 없어도

클래스의 객체인 dlg 변수에 데이터를 저장하자는 것입니다...

다른말로, 다이어로그에서 얻은 값을 해당 객체로 얻어와서 작업을 수행하자는 것이지요...


Dialog도 윈도우이기 때문에 

료시 COMMAND 메시지를 Dialog에게 전달할 것이고 메시지 핸들러가 호출 될 것입니다.

따라서 API 함수를 사용하거나 MFC에서 제공하는 보다 나은 기능을 통해

Dialog에 값을 가져올 수 있다 이겁니다....





GUI는 데이터와 보이는 영역인 UI의 Sync가 매우 중요합니다.

항상 어떤 내용이던지 매핑 되는 데이터가 있어야하는 것이지요...


따라서 위의 다이어로그에서는

각각 총 6개에 해당하는 UI 컨트롤과 데이터를 연결시켜야 합니다.


이때에 UI 컨트롤과 데이터를 연결해줄 수 있는 방법에는 두 가지가 있습니다.

하나는 제어를 위한 컨트롤 변수

또 하나에는 단지 데이터를 사용하기 위한 Value형 변수입니다.


컨트롤을 하고 싶다면 제어가 필요하니 Control 변수를 사용합니다.

예를 들어서 List Box Control을 변경하고 싶다면

이때에는 control 변수가 필요한것입니다.


하지만, 대부분 컨트롤이 제어를 위해 만들어진 것이 아닌,

사용자와의 대화를 위해 만들어졌습니다.

일반적으로 값을 구하고 싶기에 데이터를 위한 value형 변수를 많이들 사용하지요...



주석에 있는 변수와 활성화 상태의 변수는 똑같이 생겼지만, 사실 기능이 다릅니다.

왜냐하면, value형 변수이기 때문입니다.


우선 value형 변수는 


Dialog에서 변수를 따로 추가할 때 정해집니다.

그리고, 



DoDataExchange() 라는 함수를 통해 연결을 지어주는 역할을 수행합니다.


우리가 수동으로 해줘야할 것을 자동으로 해줄 뿐입니다.

아무튼... DoDataExchange() 함수는 자동으로 연결을 시켜줍니다.

뭘 자동으로 연결 시켜주냐?

바로, 다이어로그에 있는 컨트롤과 변수를 연결시켜준다는 것입니다.


다이어로그의 객체는 데이터를 가지고 있습니다.

그리고 다이어로그 윈도우가 뜰 때 그 다이어로그에 데이터를 UI로 나타내는 것입니다.

그런데 UI를 통해 데이터가 변경된다면 어떻게 해야할까요?

바로 UI와 Data의 Sync를 맞춰줘야합니다.

그런 기능을 해주는 함수가 바로 UpdateData() 함수이구요...



인자로 TRUE와 FALSE를 입력하는데 

UI에서 변경된 값을 데이터에 덮는 것이 TRUE,

변경된 data로 부터 UI에 최신화 시킬 때에는 FALSE를 사용합니다.

사실, 그리고 이 역할을 해주는 것은 DoDataExchange() 함수를 호출해주는 것입니다.


다시 한번 말씀드리지만,

데이터와 UI를 sync 시키는 것! 즉, 동기화 시키는 것이 정말 중요합니다!

모든 프로그램은 이것이 기본입니다...

Control 변수이던, Value 변수이던 변수들은 데이터이고 control은 UI 이기 때문에

반드시 Sync를 이루어야합니다. 하지만 MFC는 수동으로 해줘야합니다...

아무튼... Sync! 기억하시길 바랍니다!


자.. 그럼 저의 힙합 라임을 잘 들어보시길 바랍니다...

UI에 있던 data를 data에 update하고,

data에서 data가 변경되면 UI에 data를 끓어올리고~


지금까지 control의 value형 변수와 통신할 때의 과정을 알아봤습니다.


이상 삽잡이였습니다!