다이얼로그가 생성될 때 발생되는 메세지의 순서로는
DoModal()
PreSubclassWindow()
OnNcCreate()
OnNcCalcSize()
OnCreate()
OnSize()
OnMove()
OnSetFont()
OnInitDialog()
OnWindowPosChanging()
OnMove()
OnWindowPosChanged()
OnWindowPosChanging()
OnNcActivate()
OnActivate()
OnShowWindow()
OnWindowPosChanging()
OnNcPaint()
OnEraseBkgnd()
OnChildNotify()
OnCtlColor()
OnWindowPosChanged()
OnPaint()
OnCtlColor()
OnCtlColor()
OnNcHitTest()
OnSetCursor()
PreTranslateMessage()
OnMouseMove()
OnNcHitTest()
OnSetCursor()
PreTranslateMessage()
클래스 위자드에서 메세지 필터를 Window로 주고 발생하는 모든 메세지에 대해서
간단한 문자 출력용 핸들러를 주었다.
이 상황에서 아무것도 없는 기본 다이얼로그 화면을 DoModal() 함수로 띄웠을 때
발생하는 메세지들을 캡쳐한것이다.
어떠한 핸들러들은 afx_msg 함수로 메세지 맵에 등록되고 어떠한 함수들은
vitual로 선언되며 메세지 맵에 등록되지 않았다. 이렇게 구분되는 기준은 무얼까?
%%
메세지 맵에 등록되는 함수(핸들러) 들은 정말 윈도가 뿌려대는 메세지에 대한
핸들러이고 virtual로 선언되는 함수들은 메세지에 대한 핸들러가 아니라
프로세스가 진행되면서 당연히 호출되는 함수들이 아닐까 생각된다.
어떠한 핸들러들은 publc으로, 어떠한 핸들러들은 protected로 선언된다.
(메세지 맵에 등록된 핸들러들은 모두 protected이다.)
중요한지 아닌지는 모르겠지만 차근차근 알아봐야할 내용들..
[메세지에 대한 설명은 www.winapi.co.kr 에서 발췌]
DoModal -
PreSubclassWindow -
WM_NCCREATE -
WM_NCCALCSIZE -
WM_CREATE -
WM_SIZE -
WM_MOVE -
WM_SETFONT -
WM_ONINITDIALOG -
다이얼로그가 메모리에 만들어지고 화면에 보이기 적전에 보내진다고 한다.
오버랩드 윈도우의 WM_CREATE에 해당한다는데...
WM_WINDOWPOSCHANGING -
WM_MOVE -
WM_WINDOWPOSCHANGED -
WM_WINDOWPOSCHANGING -
WM_NCACTIVATE -
비 작업영역(client영역을 제외한 영역을 말하는것이 아닐까..)에 대한 활성
또는 비 활성화시 변경되는 내용이 있을 때 보내진다고 한다.
WM_ACTIVATE -
WM_NCACTIVATE가 비 작업 영역에 대한 메세지라면 이 메세지는 작업영역에 대한
처리를 위한 메세지..
WM_SHOWWINDOW -
윈도우의 보임 상태가 변경되기 직전에 보내진다고 한다. WS_VISIBLE 스타일을 가진 윈도우가
생성될 때도 보내진다고 한다.
WM_WINDOWPOSCHANGING -
WM_NCPAINT -
비 작업 영역을 그려야 할 때 발생한다고 한다
WM_ERASEBKGND -
윈도우 크기가 변경 되었거나 다른 윈도우에 가려진 부분이 드러났다거나 할 때 배경을 지우기 위해
이 메셎가 보내진다고 함. WM_PAINT에서 출력하기 전에 먼저 그려진 내용을 지워야 하는데 이 메세지에
대해 처리를 하지 않으면 "윈도 클래스에 등록된!!" 디폴트 배경 브러시로 지운다고함.
%% 윈도 클래스 배경 브러시가 NULL 일경우 아무것도 하지 않음.
WM_CHILDNOTIFY -
WM_WINDOWPOSCHANGING -
WM_PAINT -
1. 윈도우가 처음 생성되었을 때
2. 윈도우의 위치가 이동되었을 때
3. 윈도우의 크기가 변경, 최소, 최대화 되었을 때
4. 다른 윈도우에 가려져 있다가 드러날 때
5. 스크롤 될 때
발생한다고 한다.
WM_CTLCOLOR -
윈도우가 그려질 필요가 있을 때 발생되어 브러시의 색상을 지정하게 된다.
WM_CTLCOLOR -
WM_NCHITTEST -
마우스를 이동하거나 버튼을 누르거나 놓을 때마다 발생. 커서가 있는 위치가 윈도우의 어디쯤인지를
윈도우에게 질문을 하며 운영체제닌 이 메세지의 리턴값에 따라 마우스를 처리한다고 한다
WM_SETCURSOR -
PreTranslateMessage -
뒤로
WM_MOUSEMOVE
WM_NCHITTEST
WM_SETCURSOR
의 메세지가 연속적으로 나오는데 이 메세지는 다이얼로그 생성과는 관계가 없는듯..
또, 각 메세지들의 중간중간에 WindowProc, DefWindowProc, WM_CTLCOLOR, PreTranslateMessage
메세지가 매우 자주 섞여 나왔다.