안녕하세요. 천리안 프로그래머 포럼 C++Builder 담당자 임펠리테리입니다.
컴퍼넌트 생성에 대한 것은 여기서 처음부터 끝까지 설명하기엔 너무도 방대하구요,
또 굳이 여기서 설명하지 않아도 시중에서 구할 수 있는 서적이 많으니 설명은 생략
하죠.
빌더에서 CM_MOUSELEAVE와 CM_MOUSEENTER 메시지의 처리는 메시지맵이라는 조금 이상
하게 보이는 구조를 통해서 가능합니다. 이 메시지맵이라는 것은, 사실상은 메시지를
처리하는 함수 Dispatch()를 오버라이딩하는 구조로 되어있는데, 마지막에서 베이스
클래스의 Dispatch() 함수를 호출하는거죠. 단순한 매크로로 되어있는겁니다.
구체적인 정의를 알고 싶으시면 sysdefs.h 화일을 보시면 됩니다.
이놈을 사용하려면,
BEGIN_MESSAGE_MAP
VCL_MESSAGE_HANDLER((처리할 메시지), (메시지구조체형), (처리할 함수));
END_MESSAGE_MAP(베이스클래스 타입이름);
이렇게 해주시면 됩니다. 위치는 처리할 컨트롤의 클래스 내부구요.
물론, (처리할 함수)는 따로 선언/정의되어 있어야 합니다. 이때, 이 함수는 다음과
같아야 합니다.
MESSAGE void (함수이름)((메시지구조체형) &msg);
물론 마지막에 msg는 그냥 인자이름이니 맘대로 지으셔도 되죠.
이와같은 이론을 바탕으로, 실제로 CM_MOUSELEAVE 와 CM_MOUSEENTER의 핸들러를 만들
려면 다음과 같이 하면 됩니다.
클래스 선언 내부에,
class TForm1 : public TForm
{
....
MESSAGE void OnMouseEnter(TMessage &msg);
MESSAGE void OnMouseLeave(TMessage &msg);
BEGIN_MESSAGE_MAP
VCL_MESSAGE_HANDLER(CM_MOUSEENTER, TMessage, OnMouseEnter);
VCL_MESSAGE_HANDLER(CM_MOUSELEAVE, TMessage, OnMouseLeave);
END_MESSAGE_MAP(TForm);
};
이렇게 선언해주시고, 유니트에 OnMouseEnter()와 OnMouseLeave()함수를 구현해주면
됩니다.
작성하시는 클래스 내부에서 이와같이 해주시구요, 물론 메시지맵의 마지막에 있는
END_MESSAGE_MAP(TForm); 에서 TForm은 작성하시는 컨트롤의 베이스클래스 타입이름
이어야 하겠죠.
메시지맵은 VCL에서 지원해주지 않는 기능을 구현하기 위해 여러가지 목적으로 다양
하게 쓰입니다. 가령, 캡션바가 아닌 폼의 클라이언트영역(그냥 빈부분)을 드래그할
때 폼이 움직이도록 할때는 WM_NCHITTEST 메시지를 가로채서 처리합니다. 또 다른 많
은 목적으로도 사용가능하죠.
그럼, 도움되시길 바라면서, 이만...
독립문에서 임펠리테리였습니다.
(cbuilder, skyhi18)
|