如何根据鼠标是否在窗口中来控制窗口的缩放?(100分)

  • 主题发起人 主题发起人 FIRE_FOX
  • 开始时间 开始时间
F

FIRE_FOX

Unregistered / Unconfirmed
GUEST, unregistred user!
各位DELPHI高手:
请问如何根据鼠标是否在窗口中来控制窗口的缩放?
即当鼠标位于窗口区域时扩展窗口,当鼠标离开窗口区域时缩小窗口??
(类似于JETAUDIO的功能)
 
动态检测Mouse的位置(用Hook/或重用OnMouseMove事件),
从GetParameters()中得到有关窗口的坐标
 
截获CM_MOUSEENTER和CM_MOUSELEAVE就可以了,下面是一个简单例子。

type
TForm1 = class(TForm)
private
{ Private declarations }
procedure CMMouseEnter(var Msg: TMessage); message CM_MOUSEENTER;
procedure CMMouseLeave(var Msg: TMessage); message CM_MOUSELEAVE;
...
end;

...

procedure TForm1.CMMouseEnter(var Msg: TMessage);
begin
Height := 100;
end;

procedure TForm1.CMMouseLeave(var Msg: TMessage);
begin
Height := Height - ClientHeight;
end;
 
最简单的方法就是:
在一个循环的事件中加入以下的代码:
var
MousePoint :TPoint;
begin
GetCursorPos (MousePoint);
if (MousePoint.x < form1.Left) or (MousePoint.y < form1.Top)
or (Mousepoint.x >(form1.Left + form1.Width )) or
(Mousepoint.y > (form1.top + form1.Height )) then

//鼠标在窗口外的处理过程
else
// 鼠标在窗口内的处理过程
end;
 
比较保险的方法是截获WM_NCHITTEST消息而不是CM_MOUSEENTER,
CM_MOUSELEAVE消息, CM_MOUSEENTER和CM_MOUSELEAVE消息不准确,
比如你在form上放个Panel,当鼠标进入Panel时, 你的form就会收到CM_MOUSELEAVE消息, 而显然此时不能认为鼠标已经离开了form
 
感谢各位的热心帮助,经过自己的验证,ljactiver的方法可行,
我是将程序段放在时钟事件中。但我觉得这个方法系统时间可能
会占用较多;另外,正如Another_eYes所说的那样,CM_MOUSEENTER
和CM_MOUSELEAVE确实会因PANEL的存在而产生错误判断,并且,我
尝试了多次,始终不能很稳定地显示变化后的窗口,窗口不能很好
地接受CM_MOUSELEAVE消息;
不过,还是要请教Another_eYes,如何截获WM_NCHITTEST消息,程序
段如何编写?能给我一个简单的例子吗?
 
procedure mymouseleave(var Msg: TMessage); message CM_NCHITTEST;
 
多人接受答案了。
 
后退
顶部