본문 바로가기
Study/MFC

MFC Control SubClassing 할때(서브클래싱) | ON_NOTIFY_REFLECT_EX 와 ON_CONTROL_REFLECT_EX

by 뿡뿡대마왕 2015. 12. 10.
반응형


이번에 CtreeCtrl을 SubClassing해야 할 일이 생겼다.

뭐 기존에는 그냥 가져다 다이얼로그 붙여놓고 다이얼로그 소스 내부에서 지지고 볶고 해서 썼을텐데 이번에는

CtreeCtrl을 SubClassing 하여 좀 더 내가 필요한 기능들이 첨부되어 있는 간단한 트리 컨트롤을 만들고 싶었다.


뭐 SubClassing 해봐야 Dran&Drop 처리, Search 기능,  아이템 선택시 하위 아이템 자동 펼치기 등등..좀더 생각 나는것들은

더 처 넣겠지만..


암튼 요런거 안하다 해보니 잼나기도 하고 예전에 왜 이런거 안하고 무식하게 다이얼로그마다 컨트롤 붙이고 컨트롤 기능입히고;;..-_-;

뭐 물론 복잡한건 커스텀마이징 된 컨트롤을 갔다 썻지만 말이다...


이번에 잼났던게 ON_NOTIFY_REFLECT 와 ON_NOTIFY_REFLECT_EX  즉 메세지 Reflect 에서 대해 처리해봤는데

잘 알고 가야 할듯하다.


SubClassing을 하면 컨트를을 사용하는 쪽이 아닌 내가 만든 컨트롤 내부에서 이벤트 처리들을 할 수 있다.

그래서 드래그앤드롭 기능도 SubClassing 컨트롤쪽 소스에다가 만들어 놓았기 때문에

가져다 쓰는 쪽에서는 별도의 코드처리 없이 커스텀마이징한 컨트롤에 Tree Item 등만 넣어주면 바로 드래그앤드롭을 쓸 수 있는것이다.


근데 이런 case가 있다.


예를들어 내가 커스텀마이징 한 TreeCtrl에서는 클릭시 마다 하위 아이템이 있으면 자동으로 펼쳐지도록 해놓았다.

SubClassing을 해서 내부에서 이벤트 메세지 처리를 등록하면


BEGIN_MESSAGE_MAP(CXXXTreeCtrl, CTreeCtrl)

...

ON_NOTIFY_REFLECT(TVN_SELCHANGED, &CHTreeCtrl::OnTvnSelchanged)

...

END_MESSAGE_MAP()



위에처럼 등록될 것이다. 그러면 이 컨트롤을 쓰고 있는 다이얼로쪽에서 등록한 TVN_SELCHANGED 메세지 처리는 절대

호출되지 않는다.

위에처럼 ..._REFLECT 가 붙어 있는것은 메세지를 오버라이딩 했다고 생각하면 되겠다..

즉 부모한테는 안가고 오로지 내가 처리 해뿐다!! 라고 보면된다.


그래서 커스텀마이징하는 TreeCtrl에서 클릭시 하위아이템이 있으면 펼쳐주는 코드를 넣어놓았다.


근데 부모쪽에서 해당 TreeCtrl에서 선택시 마다 선택된 아이템의 문자열을 가져와야 하는 경우라면?


처음에 저걸 몰라. 부모 윈도우에게 강제로 메세지를 던져서 처리하려고 했다.;;;

무식하게;;; ㅜㅜ


근데 간단한 방법이 있다.


ON_NOTIFY_REFLECT(xxx,&TestFunction)

요 부분을 ON_NOTIFY_REFLECT_EX(xxx,&TestFunction) 요렇게 _EX 만 붙여주면 된다.


근데 저게 끝이 아니고!~ 붙여주고나서 호출되는 함수의 반환형을 BOOL로 변경해줘야 한다.


void TestFunction(xxx, xxx)

함수의 반환형을 


BOOL TestFunction(xxx, xxx)


로 변경하라는 말이다.


그렇게 하고 반환값에 따라 아래처럼 동작된다.


TRUE : 부모에게 전달하지 않는다.

FALSE: 부모에게도 전달


속이 다 시원하다^^


정보는 공유되어야 한다 쭈욱~~~




반응형

댓글