2010-12-14 3 views
-2

이 코드는 델파이 XE에 나를 위해 작동하지된다마우스가 양식 위에 있습니까?

http://delphi.about.com/cs/adptips2000/a/bltip0800_5.htm

procedure TForm1.FormDeactivate(Sender: TObject) ; 
begin 
    ReleaseCapture; 
end; 

procedure TForm1.FormMouseMove 
(Sender: TObject; Shift: TShiftState; X,Y: Integer) ; 
begin 
    If GetCapture = 0 then 
    SetCapture(Form1.Handle) ; 
    if PtInRect(Rect(Form1.Left, 
        Form1.Top, 
        Form1.Left + Form1.Width, 
        Form1.Top + Form1.Height), 
        ClientToScreen(Point(x, y))) then 
    Form1.Caption := 'Mouse is over form' else 
    Form1.Caption := 'Mouse is outside of form'; 
end; 

오류 - 그냥 아무 효과가 없습니다.

도와주세요. 나는이 같은 함수를 사용하여 만든 장치에 양식을 전달하고 있습니다 때문에

그것은 문제를 밝혀 1

편집 코드에없는, 심지어 마우스 FormMouseEnter 및 FormMouseLeave이 작동하지 않습니다 :

절차 슬라이드 (양식 : TForm; 표시 : 부울);

이 프로 시저 내부에서 Show 메서드를 호출하고 있습니다. 이 문제를 어떻게 극복 할 수 있습니까?

감사합니다.

편집 2 내가 지금 게시 기능을 사용하지 않으

. 사람들이 아래에 제안한 것을 사용하고 싶습니다 (FormMouseEnter 및 FormMouseLeave).하지만 제 경우에도 작동하지 않습니다.

+0

무엇이 문제입니까? – miku

+3

앞으로 : 가능한 한 많은 정보를 링크로 포함시켜 다른 사람들이 링크를 탐색하여 질문에 대답 할 수 있도록하십시오. – jpfollenius

+0

폼 캡션이 폼에서 또는 폼 밖으로 이동하는 동안 바뀌지 않습니다. 나를 위해 잘 작동합니다. – Bharat

답변

5

OnMouseEnter 및 이벤트를 사용하면 마우스 커서를 캡처하지 않고 마우스가 양식 위에 있는지 여부를 추적 할 수 있습니다.

1

내가 아는 한, SetCapture를 사용하는 것은 나쁜 생각입니다. 원하는대로 작동한다면 마우스를 추적하는 더 좋은 방법을 알지 못하기 때문에 마우스 메시지의 다른 모든 사용자를 강탈합니다.

그러나 MSDN (http://msdn.microsoft.com/en-us/library/ms646262(VS.85).aspx)에서도 SetCapture를 사용하여 외부에서 마우스 메시지가 귀하의 창으로 리디렉션되지 않을 것이라고 말합니다 마우스 버튼이 눌려져 있습니다 (올바른 이유없이 마우스를 훔치는 것).

어디에서 Show()를 호출해도 상관 없으므로 문제가 없습니다.

3

이것은 해당 양식의 OnMouseEnter 및 OnMouseLeave 이벤트에 필요한 코드를 입력하는 것입니다. 내 경우에는, 내가 한 모든했다 :

당신이 경위
개체에
이동 작업중인 폼 객체 관리자의 이벤트 탭에 전환 필요
경우를 선택 델파이
에서 새 프로젝트를 만듭니다 OnMouseEnter 이벤트까지 아래로 스크롤하여 EventHandler를 생성 할 옆의 공백을 두 번 클릭합니다.당신이 이벤트 처리기에 다음 코드와 끝까지 확인 : 오브젝트 인스펙터에

procedure TForm1.FormMouseEnter(Sender: TObject); 
begin 
    Self.Caption := 'Mouse in form'; 
end; 

이동하면 다시
새로운 이벤트를 생성하는 그것의 오른쪽에있는 흰색 영역에서 OnMouseLeave 이벤트를 두 번 클릭 찾기 핸들러는, 그리고 ... 응용 프로그램을 실행 그것을

procedure TForm1.FormMouseLeave(Sender: TObject); 
begin 
    Self.Caption := 'Mouse outside form'; 
end; 

에 다음 코드를 추가 양식 위로 마우스를 이동하고 자막은 '형태로 내부에 마우스'로 변경 형태로 외부로 이동하고 캡션을 말할 것이다 것 '마우스 외부 양식'

매력으로 작동합니다 (Delphi 2010에서 테스트되었습니다)

0

커밋이 많이 수정 된 양식 (frmTasks)이 필요했습니다. 그래서 숨겨진 캡션이있는 양식을 만들었습니다. 필자는 필요한 항목을 그리는 TImage (imgRedLogo)로 캡션을 시뮬레이션합니다. 이 코드를 사용하면 가짜 캡션 (이미지)을 클릭하고 양식을 이동할 수 있습니다. 마우스를 잡을 필요없이 매력처럼 작동합니다. 마우스 오른쪽 버튼으로도 작동합니다 (이 '기능'을 비활성화하려면 imgRedLogoMouseDown에서 'Button'매개 변수를 테스트해야합니다).

FULL 작업 CODE :

VAR 
    Dragged : Boolean= FALSE; 
    IsOverImg: Boolean= FALSE; { True if mouse if over the image } 
    OldPos : TPoint; 

procedure TfrmTasks.imgRedLogoMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); 
begin 
Dragged:= True; 
GetCursorPos(OldPos); 
end; 

procedure TfrmTasks.imgRedLogoMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); 
VAR NewPos: TPoint; 
begin 
if Dragged AND IsOverImg then 
    begin 
    GetCursorPos(NewPos); 
    frmTasks.Left:= frmTasks.Left- OldPos.X + NewPos.X; 
    frmTasks.Top := frmTasks.Top - OldPos.Y + NewPos.Y; 
    OldPos:= NewPos; 
    end; 
end; 

procedure TfrmTasks.imgRedLogoMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); 
begin 
if Dragged 
then Dragged:= False; 
end; 

procedure TfrmTasks.imgRedLogoMouseEnter(Sender: TObject); 
begin 
IsOverImg:= TRUE; 
end; 

procedure TfrmTasks.imgRedLogoMouseLeave(Sender: TObject); 
begin 
IsOverImg:= FALSE; 
end; 

을 즐길 수 있습니다.

관련 문제