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

C++빌더 FAQ
C++Builder Programming FAQ
[1] [VCL][WIN32 API] 마우스가 컨트롤 안으로 들어왔는지 알아내기
박지훈.임프 [cbuilder] 21662 읽음    2000-06-12 00:00
/Q//
마우스가 이미지안으로 들어왔는지 벗어났는지를 알아내려면 어떻게 하죠?
(델파이의 MOUSEENTER와 MOUSELEAVE를 빌더에서 구현하는 방법...)



/A//
빌더에서 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 메시지를 가로채서 처리합니다. 또 다른
많은 목적으로도 사용가능하죠.

+ -

관련 글 리스트
1 [VCL][WIN32 API] 마우스가 컨트롤 안으로 들어왔는지 알아내기 박지훈.임프 21662 2000/06/12
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.