Q&A

  • Timage 에서 OnMouseEnter 이벤트 발생에 대한 질문
Delphi5에서 TImage는 OnMouseEnter 이벤트가 없어서 추가해서 넣었는데요.

문제점이 여러개의 TImage가 있을때 한개의 TImage에서 마우스를 Down 한 상태로

마우스를 이동해서 다른 TImage에서는 OnMouseEnter 이벤트가 발생하지 않는데.

어떻게 보면 당연한 현상인거 같은데요. 마우스가 Down된 상태에서도 다른 TImage에서도

OnMouseEnter 이벤트가 발생하도록 할 수는 없나요?

3  COMMENTS
  • Profile
    장성호 2008.04.25 08:51

    CM_MOUSEENTER 메세지가 마우스 Enter이구
    CM_MOUSELEAVE 메세지가 마우스가 영역을 벗어난것이잖아요

    마우스가 dOWN된 상태에서는 MOUSE MOVE메세지도
    해당 클릭한 control에서만 나는게 정상이죠 마우스가 컨트롤의 영역을 벗어났더라도


    방법1.  만약 control의 영역을 벗어났을때 mousemove  mouseup 이벤트가 발생하지 않아도 된다면?
               그럴경우에는
                  CM_MOUSELEAVE 메세지에서 ReleaseCapture를 호출해주면 됩니다.
                  그러면 다은 control에서도 마우스 move  및 mouseenter메세지가 발생하게 되죠


    방법2.  방법1이 안되는경우에는
               MOUSEMOVE 때  현재 커서및에 있는 Control을 찾아서 메세지를 날려주는 수 밖에 없을것 같습니다.


    방법2가 좋을것 같네요..
    그럼..


  • Profile
    풍사마 2008.04.25 20:43
    답변 감사드립니다.

    저도 방법2가 더 좋은거 같은 생각이 듭니다.
    그런데 2번방법으로 하기 위해서 찾다 보니 WindowFromPoint 함수를 찾았습니다.
    그런데 이 함수는 핸들이 있는 것만 찾아지더라구요.
    TImage는 핸들을 가지고 있지 않아서 방법2가 안되었습니다.

    혹시 WindowFromPoint 말고 다른 핸들이 없더라고 현재 마우스 포인트에서의 control를
    디텍트 할수 있는 함수가 있나요?


  • Profile
    홍성락 2008.04.25 21:20
    윈 이벤트 사용하시면 더 간단해요
    CM_MOUSEENTER 등으로 검색하시면 더 많은 방법이 있습니다

    문제는 어느 컴포에서 부터 마우스 Down을 하고 밖에 나가면 다른 컴포는 전혀 윈이벤트를 못받아요.
    그래서 Mouse_Event를 언제 사용하느냐에 따라 강제로 마우스를 UP할수도 있어요.
    강제로 마우스를 UP은 실제 마우스업에 코딩된 컴포는 UP이 실행되니 주의하세요
    SendMessage를 사용하면 더 쉬운데 이거이 컴포핸들이 없으면 못쓰죠.

    하여간 아래것을 해보세요.
    <!--CodeS-->
    ...
      private
        { Private declarations }
        procedure Search(OBJ: Longint; ENTEROk : Cardinal);
        procedure WndProc(var Message: TMessage);override;
      public
        { Public declarations }
      end;

    var
      Form1: TForm1;

    implementation

    {$R *.dfm}

    //폼안에 검포 핸들 구하기
    procedure TForm1.Search(OBJ: Longint; ENTEROk : Cardinal);
    var
        i : integer;
        ChildControl: TControl;
    begin
        for i := 0 to Form1.ControlCount-1  do begin
            ChildControl := Form1.Controls[i];
            if (OBJ = Longint(ChildControl)) and (ChildControl.ClassType = TImage) then begin
               Memo1.Lines.Add(ChildControl.Name + '   TImage' + intToStr(ENTEROk));
               //해당 콤보에서만 밖으로나가면 강제UP
               if ENTEROk = CM_MOUSELEAVE then
                  Mouse_Event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
               exit;
            end;
            //모든 콤보에서만 밖으로나가면 강제UP-그러나 실제 마우스업에 코딩된 컴포는 실행되니 주의하세요
               if ENTEROk = CM_MOUSELEAVE then
                  Mouse_Event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
        end;
    end;

    procedure TForm1.WndProc(var Message: TMessage);
    var
       ccc: TControl;
    begin
       if (Message.Msg = CM_MOUSEENTER) then begin//마우스 들어올때 발생
          Search(Message.LParam, Message.Msg);
       end
       else if (Message.Msg = CM_MOUSELEAVE) then begin//마우스 나갈때 발생
          Search(Message.LParam, Message.Msg);
       end;
       inherited WndProc(Message);
    end;
    end.

    <!--CodeE-->