我正在用Delphi測試VCL應用程序。我有一個帶有標籤的空表單,我用表單FormMouseLeave
事件更改了該標籤值。它可以工作,但如果我在離開表單時按住鼠標左鍵不會觸發事件。MouseLeave事件不能用左鍵單擊按下
我試圖攔截WM_MOUSELEAVE
消息,但看起來在所有的(嗯,我猜FormMouseLeave
事件是基於消息)
我不需要觸發任何拖放,我只需要它不是我的觸發當鼠標左鍵點擊我的表單時發生的事件,我該怎麼做?
我正在用Delphi測試VCL應用程序。我有一個帶有標籤的空表單,我用表單FormMouseLeave
事件更改了該標籤值。它可以工作,但如果我在離開表單時按住鼠標左鍵不會觸發事件。MouseLeave事件不能用左鍵單擊按下
我試圖攔截WM_MOUSELEAVE
消息,但看起來在所有的(嗯,我猜FormMouseLeave
事件是基於消息)
我不需要觸發任何拖放,我只需要它不是我的觸發當鼠標左鍵點擊我的表單時發生的事件,我該怎麼做?
這是已知的WM_MOUSELEAVE
消息的行爲。你可以通過跟蹤鼠標移動來避開它,當鼠標離開時,你可以自己觸發事件。
當鼠標按鈕向下時,即使鼠標超出了界限,窗口(窗體)也會捕獲鼠標並將收到WM_MOUSEMOVE
事件。 WM_MOUSELEAVE
消息用於在沒有捕獲鼠標時跟蹤窗口內的鼠標。
如果分配MouseEnter
,MouseLeave
和MouseMove
事件表單,你可以這樣做以下:當左鍵下降
procedure TForm1.FormMouseEnter(Sender: TObject);
begin
Label1.Caption := '';
end;
procedure TForm1.FormMouseLeave(Sender: TObject);
begin
Label1.Caption := 'left';
end;
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
if not PtInRect(ClientRect, TPoint.Create(x, y)) then Label1.Caption := 'left move';
end;
的VCL框架捕獲鼠標,如果鼠標下方的控制其控制風格有csCaptureMouse
。當捕獲鼠標時,在捕獲被釋放之前不會生成WM_MOUSELEAVE
消息。當左鍵上升時會發生這種情況。
如果您從鼠標下面的控件中刪除了csCaptureMouse
,那麼只要鼠標離開窗口就會生成WM_MOUSELEAVE
消息,因爲鼠標不會被捕獲。
procedure TForm1.FormCreate(Sender: TObject);
begin
ControlStyle := ControlStyle - [csCaptureMouse];
end;
當然,改變這種風格只是爲了達到這種效果,當然不是你應該做的。我只是指出這個問題是因爲鼠標捕獲和鼠標跟蹤之間的交互。
但鼠標跟蹤和WM_MOUSELEAVE
是不是真的你在找我想。當你將鼠標放在窗體上的控件上時,會觸發WM_MOUSELEAVE
,這當然不是你想要的。
所以我認爲Dalija回答中概述的方法實際上是在任何情況下實現所需行爲的正確方法,而不管鼠標按鈕是否關閉。