CM_MOUSEENTER 메세지가 마우스 Enter이구
CM_MOUSELEAVE 메세지가 마우스가 영역을 벗어난것이잖아요
마우스가 dOWN된 상태에서는 MOUSE MOVE메세지도
해당 클릭한 control에서만 나는게 정상이죠 마우스가 컨트롤의 영역을 벗어났더라도
방법1. 만약 control의 영역을 벗어났을때 mousemove mouseup 이벤트가 발생하지 않아도 된다면?
그럴경우에는
CM_MOUSELEAVE 메세지에서 ReleaseCapture를 호출해주면 됩니다.
그러면 다은 control에서도 마우스 move 및 mouseenter메세지가 발생하게 되죠
방법2. 방법1이 안되는경우에는
MOUSEMOVE 때 현재 커서및에 있는 Control을 찾아서 메세지를 날려주는 수 밖에 없을것 같습니다.
윈 이벤트 사용하시면 더 간단해요
CM_MOUSEENTER 등으로 검색하시면 더 많은 방법이 있습니다
문제는 어느 컴포에서 부터 마우스 Down을 하고 밖에 나가면 다른 컴포는 전혀 윈이벤트를 못받아요.
그래서 Mouse_Event를 언제 사용하느냐에 따라 강제로 마우스를 UP할수도 있어요.
강제로 마우스를 UP은 실제 마우스업에 코딩된 컴포는 UP이 실행되니 주의하세요
SendMessage를 사용하면 더 쉬운데 이거이 컴포핸들이 없으면 못쓰죠.
//폼안에 검포 핸들 구하기
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.
Delphi5에서 TImage는 OnMouseEnter 이벤트가 없어서 추가해서 넣었는데요. 문제점이 여러개의 TImage가 있을때 한개의 TImage에서 마우스를 Down 한 상태로 마우스를 이동해서 다른 TImage에서는 OnMouseEnter 이벤트가 발생하지 않는데....
장성호
•
2008.04.25 08:51
CM_MOUSEENTER 메세지가 마우스 Enter이구
CM_MOUSELEAVE 메세지가 마우스가 영역을 벗어난것이잖아요
...
풍사마
•
2008.04.25 20:43
답변 감사드립니다.
저도 방법2가 더 좋은거 같은 생각이 듭니다.
그런데 2번방법으로 하기 위해서 찾...
홍성락
•
2008.04.25 21:20
윈 이벤트 사용하시면 더 간단해요
CM_MOUSEENTER 등으로 검색하시면 더 많은 방법이 있습니다
문제는 ...
CM_MOUSEENTER 메세지가 마우스 Enter이구
CM_MOUSELEAVE 메세지가 마우스가 영역을 벗어난것이잖아요
마우스가 dOWN된 상태에서는 MOUSE MOVE메세지도
해당 클릭한 control에서만 나는게 정상이죠 마우스가 컨트롤의 영역을 벗어났더라도
방법1. 만약 control의 영역을 벗어났을때 mousemove mouseup 이벤트가 발생하지 않아도 된다면?
그럴경우에는
CM_MOUSELEAVE 메세지에서 ReleaseCapture를 호출해주면 됩니다.
그러면 다은 control에서도 마우스 move 및 mouseenter메세지가 발생하게 되죠
방법2. 방법1이 안되는경우에는
MOUSEMOVE 때 현재 커서및에 있는 Control을 찾아서 메세지를 날려주는 수 밖에 없을것 같습니다.
방법2가 좋을것 같네요..
그럼..