主页
Top.Mail.Ru Yandeks.Metrika
论坛:“主要”;
当前存档:2002.04.25;
下载:[xml.tar.bz2];

向下

表单中没有WM_MouseLeave消息! 找到类似的分支


Vovochka   (2002-04-10 12:15) [0]

这里! MouseEnter - 通常来了。 感觉就像某个陷阱。 也许你需要用表格做一些棘手的事情?



MAxiMum   (2002-04-10 12:27) [1]

给出文字。



Vovochka   (2002-04-10 12:32) [2]

我只需要在鼠标离开后自动删除表单。

现在像:

TForm1 = class(TForm)
.....
procedure wmMouseLeave(var message:TMessage); message Wm_MouseLeave;
结束;
.........
程序wmMouseLeave(...);
开始
关闭; ///废话!
结束;



troits   (2002-04-10 12:53) [3]

呃......
有必要阅读帮助到最后。
事实是你需要调用TrackMouseEvent函数,然后消息将会出现_one_次。 要再次获取它,您必须再次调用TrackMouseEvent。

但这是一个API。 在你的情况下,你不应该收到消息,但CM_MOUSELEAVE - “Delphi”消息



Vovochka   (2002-04-10 13:25) [4]

嗯。
关于CM_MouseLeave,它也不能保存我 - 当鼠标进入子控件时会发生一个事件。
真的以某种方式跟踪从该区域或(失去焦点|活动)形式的鼠标的护理。 理想的是onDeactivate表单。



troits   (2002-04-10 14:10) [5]

您可以定时调用GetCursorPos / WindowFromPoint并监视ClientArea窗口的输出



MAxiMum   (2002-04-10 18:14) [6]

你继承了原因。



Vovochka   (2002-04-12 08:11) [7]

2Max
嗯。



Fantasist   (2002-04-12 08:31) [8]

好吧,最原始的,跟踪MouseMove。



REA   (2002-04-12 10:59) [9]

不要忘记检查用户按下Alt-Tab等。



troits   (2002-04-12 11:08) [10]

> Vovochka
荣誉
http://www.rsdn.ru/qna/?ui/mouseout.xml



Севостьянов Игорь   (2002-04-12 11:38) [11]

我遇到了这样的问题,事实是WM_MOUSELEAVE没有去任何地方(我的意思是操作系统)
但是,例如,我以这种方式扩展(为按钮添加了OnSelectedButton事件)到我的TToolBarEx

TToolBarEx = class(TToolBar)
private
FSelectedButton: Integer;
FMouseInControl: Boolean;
FMouseCoord: TPoint;
FOnSelectedButton: TSelectedEvent;
procedure WMNCPaint(var Msg: TWMNCPaint); message WM_NCPAINT;
procedure WMNCHitTest(var Msg: TWMNCHitTest); message WM_NCHITTEST;
procedure CMMouseLeave(var Msg: TWMMouse); message CM_MOUSELEAVE;

function GetButtonIndex: Integer;
function GetToolBarRect: TRect;
protected
procedure SetSelectedButton(Selected: Boolean);
function ButtonHitTest(X, Y: integer): Boolean; dynamic;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
property SelectedButton: Integer read FSelectedButton;
property MouseInControl: Boolean read FMouseInControl;
published
property OnSelectedButton: TSelectedEvent read FOnSelectedButton write FOnSelectedButton;
end;

-----------
{ TToolBarEx }

constructor TToolBarEx.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FSelectedButton := -1;
FMouseInControl := False;
FMouseCoord := Point(-1, -1);
end;

destructor TToolBarEx.Destroy;
begin
inherited Destroy;
end;

function TToolBarEx.GetToolBarRect: TRect;
begin
GetWindowRect(Handle, Result);
if ebTop in EdgeBorders then
Inc(Result.Top, 2);
if ebLeft in EdgeBorders then
Inc(Result.Left, 2);
if ebBottom in EdgeBorders then
Dec(Result.Bottom, 2);
if ebRight in EdgeBorders then
Dec(Result.Right, 2);
end;

function TToolBarEx.GetButtonIndex: Integer;
var
TBR: TRect;
i: Integer;
begin
TBR := GetToolBarRect;
with TBR do
begin
Result := -1;
Right := Left;
for i := 0 to ButtonCount-1 do
begin
Right := Right + Buttons[i].Width;
if PtInRect(TBR, Point(FMouseCoord.X, FMouseCoord.Y)) then Result := Buttons[i].Index;
Left := Right;
end;
end;
end;

procedure TToolBarEx.SetSelectedButton(Selected: Boolean);
var
KeyState: TKeyboardState;
begin
FSelectedButton := -1;
if Selected then FSelectedButton := GetButtonIndex;
GetKeyBoardState(KeyState);
if Assigned(FOnSelectedButton) then FOnSelectedButton(Self, FSelectedButton, KeyboardStateToShiftState(KeyState));
FMouseInControl := Selected;
end;

function TToolBarEx.ButtonHitTest(X, Y: integer): Boolean;
begin
FMouseCoord := Point(X, Y);
Result := PtInRect(GetToolBarRect, FMouseCoord);
end;

procedure TToolBarEx.WMNCPaint(var Msg: TWMNCPaint);
var
Pt: TPoint;
begin
inherited;
GetCursorPos(Pt);
SetSelectedButton(ButtonHitTest(Pt.x, Pt.y));
end;

procedure TToolBarEx.WMNCHitTest(var Msg: TWMNCHitTest);
var
KeyState: TKeyboardState;
begin
inherited;
if ButtonHitTest(Msg.XPos, Msg.YPos) then
begin
if not FMouseInControl then SetSelectedButton(True);
end
else
if FMouseInControl then SetSelectedButton(True);

GetKeyBoardState(KeyState);
if Assigned(FOnSelectedButton) then FOnSelectedButton(Self, FSelectedButton, KeyboardStateToShiftState(KeyState));

end;

procedure TToolBarEx.CMMouseLeave(var Msg: TWMMouse);
begin
inherited;
if FMouseInControl then SetSelectedButton(False);
end;
----------- ВЫЗОВ------------------

procedure TfrmMain.tbToolBarSelectedButton(Sender: TObject; Index: Integer;
Shift: TShiftState);
begin
tbtnClearDB.Enabled := (tbtnClearDB.Index = Index) and (Shift = [ssShift, ssCtrl]);
end;



在MSDN中,一切都很简单:

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.
Header: Declared in Winuser.h; include Windows.h.

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




Страницы: 1 整个分支

论坛:“主要”;
当前存档:2002.04.25;
下载:[xml.tar.bz2];

楼上





内存:0.59 MB
时间:0.024 c
14-81064
knyaz17
2002-03-19 16:34
2002.04.25
Win2000中的Oracle问题!!!


14-81037
DiG!TUS
2002-03-17 15:49
2002.04.25
帮助理解lamer从哪里开始:)


3-80787
丹尼斯大师
2002-04-04 17:35
2002.04.25
如何在DBStringGrig中更改字段名称


1-80890
神秘主义者
2002-04-14 17:21
2002.04.25
RichEdit了


14-81062
FELLINI
2002-03-20 07:24
2002.04.25
阻止程序





南非荷兰语 阿尔巴尼亚人 阿拉伯语 亚美尼亚 阿塞拜疆 巴斯克 白俄罗斯 保加利亚语 加泰罗尼亚 简体中文 中国(繁体) 克罗地亚 捷克 丹麦语 荷兰人 英语 爱沙尼亚语 菲律宾人 芬兰 法语
加利亚西语 格鲁吉亚语 德语 希腊语 海地克里奥尔语 希伯来语 印地语 匈牙利 北日耳曼语 印度尼西亚人 爱尔兰语 意大利语 日本 韩语 拉脱维亚 立陶宛 马其顿 马来语 马耳他语 挪威语
波斯语 波兰语 葡萄牙语 罗马尼亚 俄语 塞尔维亚 斯洛伐克 斯洛文尼亚 西班牙语 斯瓦希里 瑞典语 泰国人 土耳其 乌克兰 乌尔都语 越南人 威尔士语 意第绪语 孟加拉 波斯尼亚
宿务 世界语 古吉拉特语 豪萨语 苗族 伊博 爪哇 卡纳达语 高棉 老挝 拉丁语 毛利 马拉 蒙古人 尼泊尔 旁遮普 索马里 淡米尔文 泰卢固语 约鲁巴语
祖鲁
英文 Французский Немецкий Итальянский Португальский 俄文 Испанский