삽질의 현장/- MFC

#007_MFC_객체간 이동 및 참조

shovelman 2015. 10. 19. 19:07

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


이번 시간에는 각 객체들을 참조하며 정보를 얻어가며

MFC를 배워가는 시간을 가져보도록 하겠습니다.



MFC에서 View, Document와 같은 객체들은 

참조할 수 있는 틀.. 즉, 메소드가 있습니다.

또한, APP와 Frame의 객체는 단 하나밖에 없기 때문에 

어디에서든지 참조할 수 있는 기능을 제공합니다.


APP의 객체를 얻기 위해서는 AfxGetmainWnd() 함수를 사용합니다.



왜 APP의 객체를 참조하려고할까요...

그 이유는 APP은 MFC에서 View, Document, Frame과 같은 객체들의 부모로써

다운 케스트를 통해 우리가 원하고자하는 객체를 얻어올 수 있기 때문입니다.




SDI 에서는 Frame이 View와 Document를 Direct로 얻고 있는 형태입니다.

따라서, 우선은 Frame을 얻어옵니다.



예를 들어 이렇게 말입니다...


그리고 Frame을 통해 View와 Document를 바로 얻을 수 있습니다.



이렇게 사용가능하고, 활성화 되어있는 Document와 View 객체를 얻어오는 것입니다.


그런데 이 경우는 SDI에서만 가능하지, MDI에서는 불가능합니다.

왜냐하면 활성화 되어있는 놈들이 한둘이 아닐 수 있기 때문입니다.


그런데 우선 이렇게 객체들을 참조하기 위해서는 헤더를 써야하는데 주의사항이 있습니다.

헤더파일 릴레이션이라고 해서

MFC에서는 View와 Document는 서로 마주보고 있는 형태로 구조가 되어있습니다.

따라서 두 헤더를 같이 포함시켜줘야합니다.


그렇다면, MDI의 경우에, 혹은 많은 View, Document가 있을 경우에는 어떻게 해야할까요...

그런데 이들은 각각 MFC List로 연결되어있다는 사실을 아십니까?

위에 그림에서 괜히 선이 이어져있는 것이 아닙니다...


따라서 모든 객체의 참조를 얻을 수 있습니다.

이를 위해서는 최초의 위치를 가져와야합니다.



이렇게 최초 위치를 가져옵니다.

POSITION은 Node의 포인터를 얻는 것입니다.

그리고 GetNext() 메서드를 통해 list의 위치를 다음 위치로 이동시키고, 원소를 가져옵니다.



MFC의 리스트를 사용할 때 이와 같이 사용할 수 있습니다.

list를 사용해서 Document Template를 가져오면

MDI에서도 사용이 가능한 것이지요....


정리하자면,

APP 객체는 Document Template들을 가지고 있는데 이 들은 모두 List로 연결 되어있습니다.



따라서 이와 같은 예제코드를 통해 규칙적으로 순서를 찾아 객체들을 얻어올 수 있습니다.


그런데 이렇게 순차적으로 객체에 접근하는 것이 아닌,

모든 객체를 갱신시키고 싶을 때에는

UpdateAllView(NULL); 처럼 사용할 수 있습니다.


다른 방법도 있습니다.

매일 List를 사용해서만 찾기에는 불편한 점이 생길 수 있습니다.

따라서 다른 방법에는 '참조'가 있습니다.



MFC는 코드만 보면 안됩니다.

개념을 이해해야합니다...

더욱이 MFC는 Framework가 갖춰져 있고... 그 틀을 맞춰야하기 때문에 이해가 더욱 요구됩니다...


문제를 해결하는데는 방법이 하나만 있는 것이 아닙니다...

잘 설계하고 잘 이해하고...

즐거운(?) 코딩을 하도록 합시다...


이상 삽잡이였습니다!