컨트롤 Subclassing시 주의사항

Subclassing을 할 때 기초적인 부분 중의 하나이지만,
처음 subclassing을 시도하는 사람들이 흔히 실수하는 부분이라 정리하려고 한다.

* Subclassing은 무엇인가?

Subclassing은 기존에 존재하는 컨트롤(예: button)을 자신의 입맛에 맞게 바꾸기 위한 기법이다.
Superclassing이란 개념도 있지만, Subclassing은 좀 다르다. 우선은 Subclassing을 설명해야 하니 패스.

보통 Windows에서 Subclassing은 해당 control의 wndproc()을 바꾸어서 내가 원하는 message loop를 수행하도록 하는데, 메시지 후킹과 비슷하다고 생각하면 된다. (그것도 합법적으로)
메시지 후킹만 되냐? 아니다. 새로운 메시지를 직접 처리할 수 있으며, 처리 후 old_wndproc()로 메시지를 넘겨주면 기존에 수행하던 동작을 그대로 지니며 새로운 행동을 정의 할 수 있다.

이렇게 말하면 어려우니 간단하게 생각하자.
우리가 흔히 사용하는 CDialog가 있는데, Dialog-based로 프로젝트를 생성하면 CMyDlg 와 같은 CDialog를 상속받은 Dialog 클래스가 생성된다.
이 클래스는 CDialog를 Subclassing 했다고 생각하면 된다.

다른 예를 들면 CStatic이 있다고 할 때, CStatic에 그림을 그려주고 싶다면 CStatic을 상속받은 뒤 WM_PAINT에서 그림을 그려주면 된다.

지금 예로 들은것들은 모두 MFC 기준이지만, API 차원에서도 GetWindowLong()을 이용하여 함수의 wndproc을 얻어와서 내가 원하는 wndproc를 실행하게 할 수 있다.



그렇다면 무엇이 문제일까?
Subclassing 된 컨트롤은 WM_CREATE 메시지를 받지 못한다. 정확히는 Dialog에 그려넣은 Control에서 이런 문제가 발생한다.
이는 resource에 포함된 dialog가 생성될 때 초기화 되는 관계로 발생되는 문제이며, OnCreate, PreCreateWindow() 모두 동작하지 않는다.

해결책은 PreSubclassWindow에서 처리하는 방법이다.
(너무 간단한가;;)
크리에이티브 커먼즈 라이센스
Creative Commons License

Posted by 장현준

2007/10/28 02:11 2007/10/28 02:11
Response
No Trackback , No Comment
RSS :
http://b4you.net/blog/rss/response/143

MFC Control Subclassing #1

까먹기 전에 MFC에서 컨트롤을 Subclassing 하는 기법에 대해 정리를 해 두어야 겠다.
예전에 프로젝트를 진행하면서, 많은 Control들을 subclassing했었는데..
그냥 썩혀두긴 아까우니 말이다.

아주 간단한 버튼부터 리스트 컨트롤까지..
야매 코드(!!!)와 함께 소개할 예정이다.
(실제로 리스트 컨트롤은 서브클래싱 난이도가 극악이다. 딴건 몰라도 스크롤바 때문에 굉장히 어렵다. 이걸 야매로 처리하는 코드가 있다.)

상용 UI 라이브러리를 사면.. 이런것 모두 깔끔하게 되더만...
왜 우리는 이런걸 만들 수 있는 능력이 없을까.ㅠ_ㅠ

나 또한 부족한점이 많지만, 하나하나 확실히 해가자는 의미에서 다음과 같이 정리할 생각이다.

1. 가장 만만한 CButton
2. 그 담에 내맘대로 요리하는 CStatic
3. 짜증나는 CEdit
4. 비교적 쉬운 CListBox
5. 해본적 없는(-_-) CComboBox
6. 이것 또한 해본적 없는(;;) CTreeCtrl (또는 CTreeView)
7. 야매로 처리하자 CListCtrl (또는 CListView)

소스는 아마 일반적인 Subclassing 기법에 다루기 때문에.. 다들 아는 내용일꺼라 생각한다.
예를들어 CButton에는 그림넣기 이런것?
뭐 subclassing이라는게.. 특이한 요구조건이 없으면 거의다 비슷비슷해서; 별거 없는거같다.

시작은 거창하지만 -ㅅ- subclassing에 대해 모아놓은 자료가 없으니.. 시작을 해봐야겠다.

이것 또한 시작하는 날짜는 11월 초.
현재 진행하는 연구실 프로젝트가 간당간당 하당께요-_-...... 후덜덜덜...
크리에이티브 커먼즈 라이센스
Creative Commons License

Posted by 장현준

2007/08/06 23:25 2007/08/06 23:25
,
Response
No Trackback , No Comment
RSS :
http://b4you.net/blog/rss/response/129


블로그 이미지

빗소리를 먹는 사람.

- 장현준

Notices

Archives

Authors

  1. 장현준

Recent Trackbacks

  1. 듀얼클러치의 생각 rsvin28's me2DAY 2009

Calendar

«   2012/02   »
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29      

Site Stats

Total hits:
158015
Today:
85
Yesterday:
228