内有详细内容(窗体移出的消息问题)(100分)

  • 主题发起人 主题发起人 kmask
  • 开始时间 开始时间
K

kmask

Unregistered / Unconfirmed
GUEST, unregistred user!
内有详细内容(窗体移出的消息问题)

刚发现的问题
一程序,窗体置中,我截获 cm_mouseleave 却没有反应(指鼠标移到窗体之外),
但是移动到该窗体上的wincontrol就可以。

例:

public
procedure mouseenter(var msg:tmessage);message wm_mouseenter;
procedure mouseleave(var msg:tmessage);message wm_mouseleave;

implementation

procedure tform1.mouseenter(var msg:tmessage);//一切正常
begin
inherited;
caption:='enter';
end;

procedure tform1.mouseleave(var msg:tmessage);//*******************
begin
inherited;
caption:='leave';
end;


加星的过程是令我疑惑的地方


移出窗体时,无反应,但是移动到窗体内的panel就有效,然而,
在窗体外的任意地方(如desktop)点击鼠标,也就是焦点离开 form1 时,产生killfocus,梦寐以求
的'leave'才会出现。

本来,我想截获wm_setcursor 应该也可以,但是 form1 是 bsnone 的,无 can resize 边界。
有没别的消息???

头晕啊。

快来猛烈的讨论一下吧
快来猛烈的讨论一下吧
快来猛烈的讨论一下吧

谢绝灌水
 
没有办法,wm_mouseleave 消息的确是不好使:-(
用 WM_NCHITTEST 好了,虽然麻烦点,但很准:-)
 
mouseleav消息只是在鼠标在移出窗体的一瞬间被触发,如果移到了别的应用程序,消息是不能被捕获的
 
我的怎么连WM_MOUSEENTER这个消息都没有呀,提示未申明。
 
怎么做都不行,不如做个勾子,判断鼠标位置,配合窗体。
 
首先要纠正一正所贴的代码中,
WM_MouseEnter 应为 CM_MouseEnter
WM_MouseLeave 应为 CM_MouseLeave

MouseLeave确实较难捕获,因为鼠标一离开Form,相应的事件不再由Form
所属进程捕捉。

不考虑Form上其它控件的情况下,在Form的OnCreate事件中加入以下代码:
SetCapture(handle)
这样似乎可以捕捉在Form外发生的鼠标事件,但这样做有一个缺点:在按下
鼠标键时(任意键)移动鼠标,确实可以捕捉上述两个事件。

至此,在Form的相关事件中发送一个MouseDown事件应该就可以,那么应该在
哪个事件中呢?在MouseMove中?

当然要成为完整的程序还有很多要考虑,以上思路当否请指教!

以下为测试代码:

unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls,extctrls;

type

TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
private
{ Private declarations }
public
procedure mouseenter(var msg:tmessage);message cm_mouseenter;
procedure mouseleave(var msg:tmessage);message cm_mouseleave;
{ Public declarations }
end;

var
Form1: TForm1;

implementation
{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
begin
setcapture(handle);
end;
procedure TForm1.mouseenter(var msg: tmessage);
begin
caption:='enter';
end;

procedure TForm1.mouseleave(var msg: tmessage);
begin
caption:='Leave';
end;

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
// send mouse down message, //忘了如何发送这一事件
end;
end.
 
hmask:
只要把WM_MOUSEENTER和WM_MOUSELEAVE改成jsxjd说的CM_MOUSEENTER和CM_MOUSELEAVE,
然后按照你的代码,在我这里运行很正常啊,D6,2000SERVER。
 
多人接受答案了。
 

Similar threads

D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部