|
CM_MOUSEENTER와 CM_MOUSELEAVE를 인식하게 하는 아래와 같은 Image Component를 새로 만들어
폼 위에 올려놓고 새로운 Event의 Handler를 만든 후 ShowMessage를 사용해 테스트해 보았습니다.
그런데 MouseEnter는 이상없이 작동하나 MouseOut의 경우 마우스가 컴포넌트를 빠져나가면
ShowMessage가 무한대로 실행되는 일이 발생합니다.
(그 상태에서 다시 마우스 포인터를 컴포넌트 안에 넣으면 MouseEnter와 MouseOut내 ShowMessage 가
교대로 무한대로 발생합니다...ㅡㅜ)
이를 한 번만 수행하게 하려면 어떻게 해야 하는지 고수님들의 가르침 부탁드립니다...
그리고 해당 Component내에서 Drag&Drop Event의 Source와 유사한 기능을 하는 파라미터
(구체적으로 MouseEnter에서는 Source 파라미터가 이전에 마우스 포인터가 올라갔던 컴포넌트를 넘기고,
MouseOut에서는 해당 파라미터에 새로 마우스 포인터가 올라간 컴포넌트를 넘기고자 합니다)
를 작성할 수 있는 방법이 있다면 알려주시면 감사하겠습니다...
소스는 아래와 같습니다.
//MyImage.h
class PACKAGE TMyImage : public TImage
{
private:
protected:
TNotifyEvent FOnMouseEnter;
TNotifyEvent FOnMouseOut;
BEGIN_MESSAGE_MAP
VCL_MESSAGE_HANDLER(CM_MOUSEENTER, TMessage, OnMouseEnterEvt)
VCL_MESSAGE_HANDLER(CM_MOUSELEAVE, TMessage, OnMouseOutEvt)
END_MESSAGE_MAP(TImage)
void __fastcall OnMouseOutEvt(TMessage & Message);
void __fastcall OnMouseEnterEvt(TMessage & Message);
public:
__fastcall TCtlImage(TComponent* Owner);
__published:
__property TNotifyEvent OnMouseEnter
= {read=FOnMouseEnter, write=FOnMouseEnter};
__property TNotifyEvent OnMouseOut
= {read=FOnMouseOut, write=FOnMouseOut};
__property OnClick;
};
//MyImage.cpp
...
void __fastcall TCtlImage::OnMouseOutEvt(TMessage & Message)
{
if(FOnMouseOut) FOnMouseOut(this);
}
void __fastcall TMyImage::OnMouseEnterEvt(TMessage & Message)
{
if(FOnMouseEnter) FOnMouseEnter(this);
}
//Form 구현부
void __fastcall TForm1::FormMouseMove(TObject *Sender, TShiftState Shift,
int X, int Y)
{
//if(dynamic_cast<TForm*>(Sender)->)
}
//---------------------------------------------------------------------------
void __fastcall TForm1::MyImage1MouseOut(TObject *Sender)
{
ShowMessage("Mouse Out is working!!!");
}
void __fastcall TForm1::MyImage1MouseEnter(TObject *Sender)
{
ShowMessage("Mouse Enter is working!!!");
}
|