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
[27994] 자답.....
초보 [] 982 읽음    2003-11-26 20:45
아래와 같이 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!!!");
: }

+ -

관련 글 리스트
27989 MouseEnter / MouseOut 구현 중 문제가 발생합니다... 초보 1130 2003/11/26
27994     자답..... 초보 982 2003/11/26
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.