|
아래와 같이 OnMouseOutEvt 메시지 핸들러에서 FMouseOut 부분을 크리티컬 섹션으로 간주하여 Lock변수를 사용하였더니 해결이 되었습니다...
class TMyImage : public TImage
{
protected:
bool FLock;
...
}
//Constructor
{
FLock = false;//Lock 초기화(해제상태)
}
MESSAGE void __fastcall TMyImage::OnMouseOutEvt(TMessage & Message)
{
if(!FLock) {
FLock = true;//Lock설정
if(FOnMouseOut) FOnMouseOut(this);
FLock = false;//Lock해제
}
}
일단 해결은 했습니다만 스레드 같은것도 일체 사용하지 않은 한 process내에서 한번 CM_MOUSELEAVE 메시지가 발생할때 해당 메시지가 Mutex로 처리되지 않는 것이 정말 이상합니다... Windows 2000 Server에서만 그러는 것인지는 모르겠지만...
초보 님이 쓰신 글 :
: 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!!!");
: }
|