C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[1589] [답변] ZPIKN205/ 메세지 처리에 대하여/프포
박지훈.임프 [cbuilder] 3630 읽음    1999-07-14 20:01
안녕하세요. 천리안 프로그래머 포럼 C++Builder 담당 임펠리테리입니다.

정말.. 오랜만에 오셔서는 질문보따리만 풀어놓고 도망가시다니... ^^

저번에도 하이텔 비파툴에서 비슷한 질문을 하셨었죠? 그때는 Dispatch()와 메시지맵

의 관계를 물어보셨었는데.. 메시지맵이 사실상은 베이스클래스의 Dispatch() 함수를

오버라이딩하는 것이라고 알려드렸었습니다.

이번에는 SDK상의 윈도우 프로시저와 TControl::WndProc() 함수 사이의 관계를 질문

하셨군요. 먼저 결론부터 말씀드리면, 두 함수는 직접적인 관계는 없습니다.

sdk상의 윈도우 프로시저의 형은 Long WndProc(hwnd, uMsg, wParam, lParam)인데,

TControl::WndProc() 함수의 형은 void __fastcall WndProc(TMessage &Message)이죠.

두 함수가 서로 오버라이딩이 되려면 시그니처(함수의 인자 리스트와 리턴값)이 같아

야 가능하다는 기본적인 c++ 문법은 기억하시죠?

sdk상의 윈도우프로시저가 vcl상에서 관련되는 곳은, 최초로 윈도우(TWinControl)가

생성되는 곳입니다. (당연하겠죠?) TWinControl::CreateWnd() 함수가 실제로 윈도우의

핸들을 생성시키는데, 이때 InitWndProc() 함수를 윈도우 클래스의 인자로 넘기는데,

여기서 InitWndProc() 함수가 바로 sdk상의 윈도우 프로시저입니다.

반면에, TControl::WndProc은 기본적으로 vcl의 상속단계에서 메시지를 처리해주기

위한 case문(C++의 switch~case문)을 가지고 있습니다. 여기서 각각의 메시지를

처리해주고, 해당 처리루틴이 없으면 한단계 상위 클래스의 WndProc()을 실행시키죠.

이러한 처리루틴 검색과정 중에 (어떤 클래스인가에 따라 달라집니다만) 특정 메시지

에 대해서는 WndProc() 함수가 직접 처리하지 않고 Dispatch()를 실행시켜 처리를

의뢰하는데, Dispatch()는 다시 해당 메시지에 대한 처리루틴을 찾아보고, 없을 경우

기본적으로 설정된 sdk상의 윈도우프로시저를 실행시키도록 되어 있습니다.

vcl의 메시지 처리가 아주 복잡한지라 간단히 설명하기가 쉽지 않은데.. 요약하면,

해당 클래스 객체로 들어온 메시지는 일차적으로 클래스이름::WndProc()에서 처리되고

처리루틴을 발견하지 못하면 Dispatch()를 통해 해당 윈도우 핸들에 연결된 기본

윈도우 프로시저에 넘겨집니다. 여기도 해당 처리 루틴이 없으면 베이스클래스로

넘겨지는 거죠.

이 정도가 현재까지 제가 빌더/델파이와 vcl을 다루면서 알아낸 것입니다.

하지만 모든 클래스에 공통적으로 다 들어맞는 것은 아니고, 해당 클래스의 특성에

따라 조금씩 다른 처리 구조를 가지고 있습니다.

그럼 참고하시길...



임펠리테리 박지훈이었습니다.

(http://myhome.thrunet.com/~cbuilder, cbuilder@thrunet.com)



+ -

관련 글 리스트
1586 [질문] 메세지 처리에 대하여/프포 zpikn205 3579 1999/07/14
1589     [답변] ZPIKN205/ 메세지 처리에 대하여/프포 박지훈.임프 3630 1999/07/14
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.