2010-12-14 99 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不工作,因为我传递的形式我这样的功能创造了一个单位:

程序Slide(Form:TForm; Show:Boolean);

我从这个过程中调用Show方法。我怎样才能克服这个问题?

谢谢。

EDIT 2

我不想用我现在张贴的功能。我想使用下面提到的人们(FormMouseEnter和FormMouseLeave),但它在我的情况下也不起作用。

+0

什么问题? – miku 2010-12-14 10:37:45

+3

面向未来:尝试从链接中包含尽可能多的信息到您的问题中,以便其他人不必通过链接浏览以便能够回答问题。 – jpfollenius 2010-12-14 10:44:47

+0

是不是形式标题改变,同时移动鼠标进出窗体,其工作正常对我来说 – Bharat 2010-12-14 10:51:35

回答

5

您可以使用OnMouseEnterOnMouseLeave事件来跟踪鼠标是否在表单上,​​而不捕获鼠标光标。

1

据我所知,使用SetCapture这是一个坏主意。如果它像你希望的那样运作,那么只会因为你不知道追踪鼠标的更好方法而抢劫其他人的鼠标消息。

但MSDN说(即使使用SetCapture,外部的鼠标消息也不会被重定向到您的窗口,除非)(http://msdn.microsoft.com/en-us/library/ms646262(VS.85).aspx)鼠标按钮关闭(可能是一种措施,以防止你到底想要达到什么目的:在没有正当理由的情况下盗取鼠标)。

无论你从哪里调用Show(),所以你的问题不在于此。

3

这只是在相应表单的OnMouseEnter和OnMouseLeave事件中输入必要的代码。就我而言,我所做的就是:

创建德尔福
一个新的项目选择 切换到Object Inspector中的事件标签如有必要
你与
去工作,在Object Inspector
形式向下滚动到OnMouseEnter事件,双击它旁边的空白处,它将生成一个EventHandler。请确保你结束了在事件处理程序下面的代码:

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

转到Object Inspector中再次
发现在白色区域OnMouseLeave在事件并双击它来生成新的活动的权利处理程序,并将下面的代码添加到它

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

运行程序...将鼠标移到表格,标题将更改为“鼠标内部形式”,将它的形式之外,字幕会说'鼠标外形'

作为一个魅力工作(在德尔福2010年测试)

0

我需要一个窗体(frmTasks)与重大修改的标题。所以我创建了一个带有隐藏标题的表单。我使用TImage(imgRedLogo)模拟Caption,在该图像上绘制我需要的东西。 此代码让用户点击假标题(图片)并移动表格。像没有捕获鼠标的魅力一样工作。它甚至可以用鼠标右键来操作(如果你想禁用这个'功能',你必须在imgRedLogoMouseDown中测试'Button'参数)。

FULL工作代码:

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; 

享受。