2016-04-01 22 views
3

我正在用Delphi測試VCL應用程序。我有一個帶有標籤的空表單,我用表單FormMouseLeave事件更改了該標籤值。它可以工作,但如果我在離開表單時按住鼠標左鍵不會觸發事件。MouseLeave事件不能用左鍵單擊按下

我試圖攔截WM_MOUSELEAVE消息,但看起來在所有的(嗯,我猜FormMouseLeave事件是基於消息)

我不需要觸發任何拖放,我只需要它不是我的觸發當鼠標左鍵點擊我的表單時發生的事件,我該怎麼做?

回答

4

這是已知的WM_MOUSELEAVE消息的行爲。你可以通過跟蹤鼠標移動來避開它,當鼠標離開時,你可以自己觸發事件。

當鼠標按鈕向下時,即使鼠標超出了界限,窗口(窗體)也會捕獲鼠標並將收到WM_MOUSEMOVE事件。 WM_MOUSELEAVE消息用於在沒有捕獲鼠標時跟蹤窗口內的鼠標。

如果分配MouseEnterMouseLeaveMouseMove事件表單,你可以這樣做以下:當左鍵下降

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; 
4

的VCL框架捕獲鼠標,如果鼠標下方的控制其控制風格有csCaptureMouse。當捕獲鼠標時,在捕獲被釋放之前不會生成WM_MOUSELEAVE消息。當左鍵上升時會發生這種情況。

如果您從鼠標下面的控件中刪除了csCaptureMouse,那麼只要鼠標離開窗口就會生成WM_MOUSELEAVE消息,因爲鼠標不會被捕獲。

procedure TForm1.FormCreate(Sender: TObject); 
begin 
    ControlStyle := ControlStyle - [csCaptureMouse]; 
end; 

當然,改變這種風格只是爲了達到這種效果,當然不是你應該做的。我只是指出這個問題是因爲鼠標捕獲和鼠標跟蹤之間的交互。

但鼠標跟蹤和WM_MOUSELEAVE是不是真的你在找我想。當你將鼠標放在窗體上的控件上時,會觸發WM_MOUSELEAVE,這當然不是你想要的。

所以我認爲Dalija回答中概述的方法實際上是在任何情況下實現所需行爲的正確方法,而不管鼠標按鈕是否關閉。

相關問題