一个有关CM_MouseLeave的问题

oldhawk 2002-01-04 09:28:55
CM_MouseLeave消息好象不太灵敏,当鼠标快速移出窗体时,就收不到这个消息,请问大家有什么好办法吗?
...全文
448 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
oldhawk 2002-01-07
  • 打赏
  • 举报
回复
浪人:
在我的WINDOWS98S上测了一下,十分灵敏,感激不尽!分都给你了。
后会有期!
VSaber 2002-01-07
  • 打赏
  • 举报
回复
to oldhawk(老鹰):上面贴一大堆东西,不好意思,因为我对他有点生气而已,呵呵
给你的代码,很简单,值得注意的就一点,TrackMouseEvent的调用在窗体的mousemove里面,good lucky!!!:

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;

type
TForm1 = class(TForm)
procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
private
{ Private declarations }

procedure MouseLeave(var Msg: TMessage); message WM_MOUSELEAVE;

public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
var
xh: TTrackMouseEvent;
begin
xh.cbSize := sizeof(xh);
xh.dwFlags := TME_LEAVE;
xh.hwndTrack := Handle;
xh.dwHoverTime := 0;
TrackMouseEvent(xh);
end;

procedure TForm1.MouseLeave(var Msg: TMessage);
begin
Caption := Caption + '#';
Msg.Result := 0;
end;

end.
VSaber 2002-01-07
  • 打赏
  • 举报
回复
to ss(雅龙):
至于我是不是瞎搞,你把你的msdn换正版把,难道你的msdn和我的不一样,奇怪!WM_MOUSELEAVE到底是不是windows消息,我给你看看,我现在还用不上win64,不好意思:
下面是msdn拷贝,自己看看吧:

Platform SDK: Windows User Interface
WM_MOUSELEAVE
The WM_MOUSELEAVE message is posted to a window when the cursor leaves the client area of the window specified in a prior call to TrackMouseEvent.

A window receives this message through its WindowProc function.

LRESULT CALLBACK WindowProc(
HWND hwnd, // handle to window
UINT uMsg, // WM_MOUSELEAVE
WPARAM wParam, // not used
LPARAM lParam // not used
);
Parameters
This message has no parameters.

Return Values
If an application processes this message, it should return zero.

Remarks
All tracking requested by TrackMouseEvent is canceled when this message is generated. The application must call TrackMouseEvent when the mouse reenters its window if it requires further tracking of mouse hover behavior.

Requirements
Windows NT/2000: Requires Windows NT 4.0 or later.
Windows 95/98: Requires Windows 98 or later.
Header: Declared in Winuser.h; include Windows.h.

See Also
Mouse Input Overview, Mouse Input Messages, GetCapture, SetCapture, TrackMouseEvent, TRACKMOUSEEVENT, WM_NCMOUSELEAVE

Built on Thursday, October 12, 2000Requirements
Windows NT/2000: Requires Windows NT 4.0 or later.
Windows 95/98: Requires Windows 98 or later.
Header: Declared in Winuser.h; include Windows.h.
See Also
Mouse Input Overview, Mouse Input Messages, GetCapture, SetCapture, TrackMouseEvent, TRACKMOUSEEVENT, WM_NCMOUSELEAVE
oldhawk 2002-01-06
  • 打赏
  • 举报
回复
先谢了。
另外说一句,我刚试了用SetCapture的方法,但效果不好。
ss 2002-01-06
  • 打赏
  • 举报
回复
.net中有这个消息啊
ss 2002-01-06
  • 打赏
  • 举报
回复
wm_mouseleave是windows的消息吗?瞎搞嘛!你说的是win64还是win32啊
VSaber 2002-01-06
  • 打赏
  • 举报
回复
明天给你一个例子
oldhawk 2002-01-06
  • 打赏
  • 举报
回复
但我手边的DELPHI 5的WIN REFERENCE手册中trackmouseevent的QUICKINFO明确指出不支持。
浪人,能让我看看你的代码吗?我的代码如下:

procedure TForm1.Button1Click(Sender: TObject);
var
e: TagTRACKMOUSEeVENT;
begin
E.cbSize:= SIZEof(TagTRACKMOUSEeVENT);
E.dwFlags:= TME_LEAVE;
E.dwHoverTime:= 10;
E.hwndTrack:= handle;
trackmouseevent(e);
end;

procedure TForm1.WMMouseLeave(var M: TMessage);
begin
color:= clRed;
end;

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
color:= clBlue;
end;

不行。
VSaber 2002-01-06
  • 打赏
  • 举报
回复
不会呀,trackmouseevent虽然我没在98下测试,但是msdn上说了支持98,不要告诉我ms在骗我:)呵呵

Windows NT/2000: Requires Windows NT 4.0 or later.
Windows 95/98: Requires Windows 98 or later.
Header: Declared in Winuser.h; include Windows.h.
Library: Use User32.lib.
oldhawk 2002-01-05
  • 打赏
  • 举报
回复
好象不行,trackmouseevent是NT的函数。
我在98下试了试,没有反应。
VSaber 2002-01-04
  • 打赏
  • 举报
回复
wm_mouseleave是windows的消息,我测试过处理mouseleave绝对很不错,虽然必须结合trackmouseevent函数使用,不是很方便,但是效果嘛,最好!
yuiac 2002-01-04
  • 打赏
  • 举报
回复
我正好有同样的问题,上面几位的意见都不一样,能不能说的详细一点。
sky_line 2002-01-04
  • 打赏
  • 举报
回复
使用wndpro函数
qiubolecn 2002-01-04
  • 打赏
  • 举报
回复
要SetCapture
VSaber 2002-01-04
  • 打赏
  • 举报
回复
cm_mouseleave的确不太好用,应该用wm_mouseleave这个消息结合trackmouseevent这个api使用!绝对好用,呵呵,只不过比cm_mouseleave麻烦一点点了!
oldhawk 2002-01-04
  • 打赏
  • 举报
回复
移出窗体了,不行。
enlightenment 2002-01-04
  • 打赏
  • 举报
回复

那就用上一级组件的CM_MouseEnter配合

想要学习DELPHI的控件开发,这个资料非常的值得一看。 Delphi控件开发 1~8 由CowNew开源团队撰写。 文章将通过一个简单的例子来为初学者介绍编写控件的一些基本方法和模式。   这个例子控件叫TLeiLabel,是在TLabel的基础上增加两个实用的功能:一是使文字具有立体形状,二是使文字具有超链接属性。下面就让我们一步步来实现这些功能。   一、使文字具有立体形状   首先定义类型T3DEffect和属性Style3D分别如下:   T3DEffect=(Normal,Raised,Lowered, Shadowed);   property Style3D:T3DEffect read FStyle3D write SetStyle3D default Normal;   再在private中定义变量:“FStyle3D:T3DEffect;”,并设置SetStyle3D()方法如下,这也是写方法的一般格式:   procedure TLeiLabel.SetStyle3D(Value: T3DEffect);    begin    if FStyle3D <> value then    begin    FStyle3D := value;    invalidate; //表示控件将重画    end;    end;   另外对于带阴影的文字还要定义阴影的偏移量ShadeXOffSet和ShadeYOffSet:   property ShadowXOffSet: integer read FXOffSet write SetFXOffSet default 5;   property ShadowYOffSet: integer read FYOffSet write SetFYOffSet default -5;   写方法SetFXOffSet()、SetFYOffSet()和上面的SetStyle3D()类似。   要重画控件一般要重载Paint方法,此处只是重画文字,我们只需重载DoDrawText方法。   DoDrawText的声明放在Protected中:   procedure DoDrawText(var Rect: TRect; Flags: Longint); override;   此处DoDrawText()根据四种类型(正常、凸起、凹进和阴影)分别画出不同的文字。 二、使文字具有超链接属性   定义一个属性URL表示要链接的网址或Email地址。   Property URL : String read FURL write SetURL;   写方法SetURL如下:   procedure TLeiLabel.SetURL(Value: String);   Begin   if FURL <> Value then FURL := Value ;   if FURL <> then   Cursor := crHandPoint;   end;   当点击此Label时要打开浏览器或收发邮件工具,这便要重载Click方法。    Procedure Click; Override;    procedure TLeiLabel.Click;    var s: string;    Begin    Inherited Click;    if FURL = then exit;    if LowerCase(Copy(FURL,1,7)) = http:// then    s := FURL    else if Pos(@,FURL) <> 0 Then    s := mailt + FURL    else    s := http:// + FURL;    ShellExecute(Application.Handle, open, PChar(s), NIL, NIL, SW_SHOWNORMAL);    end;   一般的超链接当鼠标移入时文字的颜色发生变化。为此加上属性HoverColor,表示鼠标移入时文字的颜色。   Property HoverColor : TColor Read FHoverColor Write SetHoverColor default clRed;   还要定义两个接收Windows消息CM_MOUSEENTER和CM_MOUSELEAVE(鼠标移进和移出)的过程:   Procedure CMMouseE

5,392

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧