2016-04-01 10 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の答えに概説されているアプローチは、マウスボタンが押されているかどうかにかかわらず、実際にどのような場合でも望ましい動作を実装する正しい方法だと思います。

関連する問題