5


1

MFCでは、ダブルマウスクリックイベントにより、次の一連のメッセージが表示されます。

  • WM_LBUTTONDOWN

  • WM_LBUTTONUP

  • WM_LBUTTONDBCLK

  • WM_LBUTTONUP

そのため、* WM_LBUTTONDBCLK *メッセージに応答すると、ダブルクリックを検出できます。 しかし、シングルクリックを検知したいだけなら、どのように区別すればよいですか。

しかし、* WM_LBUTTONUP *メッセージを見るだけでは十分ではありません。シングルクリックの場合もあれば、ダブルクリックの最初のクリックの場合もあります。

シングルクリックだけでうまく識別できますか。

7 Answer


10


(これらのイベントをMouse UpとMouse Downと呼ぶようにしてください。 私のMFCは少し錆びています。 そして最近、私の専門用語をめちゃくちゃにしていた.NETと呼ばれるものがあります;-)

短い話:あなたは単にマウスクリックについて知りたくないのです。 あなたはもっと必要としている。

長い話

これは直観的ではありませんが、マウスをクリックするだけでは珍しいことです。 ほとんどの場合、Mouse Downで何らかの処理を実行し、Mouse Upでさらに処理を実行する必要があります。 トリックは、単にマウスアップメッセージを追跡するだけでは十分ではないということです。マウスダウンはあなたのウィンドウで起きていないかもしれません。 それならそれは有効なクリックだと思いますか? 特にマウスダウン処理(項目の選択など)が発生しなかったことを考慮してください。

推論をさらに進めると、マウスダウンを処理した後にマウスアップを受け取ることに頼るべきではありません。ユーザーがマウスを動かして他の場所にボタンを離した可能性があります(ドラッグアンドドロップだと思います)。 MouseUpイベントを受け取ります。 MouseDownでマウスをキャプチャして、マウスがウィンドウを離れても確実にMouse Upまでマウスイベントが表示されるようにしない限り。

結局、あなたはMouse Downを追跡し、マウスを捕獲し、そしてMouse Upを受け取ったら、捕獲を所有しているかどうかをチェックするだけです。 そうでない場合は、マウスをダブルクリックした(2度目のマウスダウンはしない)か、マウスダウンが他の場所で発生したため、このマウスアップを気にしないでください。

結論として:それほどうまくいかないという理由で、MouseClickメッセージはありません。とにかく、より多くのメッセージを処理し、より多くのメカニズムを実装する必要があります。

ああ! また、リストビューなど、このアイテムと選択項目をすべて処理している既存のコントロールを処理している場合は、Item ActivateやItem Selection Changedなどの同様のカスタム通知が表示される可能性があります。


1


私はちょうどDelphiでこれを試しました、動作は同じです:ダブルクリックが起こっている時でさえ、シングルクリックイベントは2つのうちの最初のものの直後に発行されます。

私はこのように動作するタイマーを使用してそれを解決しました:

  • WM_LBUTTONDBLCLKのタイマーを無効にします(そして `+ bDbl `を ` true +`に設定します)

  • `+ bDbl == false +`の場合、WM_LBUTTONUPでタイマーをアクティブにします

  • `+ bDbl == true `の場合はWM_LBUTTONUPで非アクティブ化(および ` bDbl +`をリセット)

タイマーの間隔を、 `+ GetDoubleClickTime +`によって返される時間に設定します。

MSDNは言う:

_ GetDoubleClickTime関数は、マウスの現在のダブルクリック時間を取得します。 ダブルクリックとは、マウスボタンを2回クリックした後の2回目のクリックです。 ダブルクリック時間は、ダブルクリックの1回目のクリックと2回目のクリックの間に発生する最大ミリ秒数です。 _

タイマーが起動した場合、あなたは本当のクリックがあります。 私の場合、ダブルクリックの間隔は500msなので、「本物のクリック」はこれだけ長くなります。


0


WM_LBUTTONUPの前にWM_LBUTTONDOWNが複数回呼び出されていないことを確認できます。 実際には、あなたがWM_LBUTTONDBCLKを取得してもWM_LBUTTONUPを取得しない傾向があるので、Windowsはあなたのためにこれを行います。


0


PreTranslateMessage()を使用して、メッセージが表示されたとおりにカウントすることができます。 シングルクリックに対応するマウスメッセージのみを受信し、ダブルクリックのシステム設定時間が経過した場合は、それがシングルクリックであると見なすことができます。

私が知っている限りでは、これが起こっているようなケースであることを知る方法はありません。これは理にかなっています。


0


それは少しトリッキーです。

WM_LBUTTONDOWNを検出します そのタイムアウトの間にWM_LBUTTONDBCLKがない場合は、シングルクリックです。

これは別のスレッドを実行する必要があることを意味するかもしれませんが、私はあなたが1つのスレッドでそれを達成することができると思います。


0


私の解決策は最初のクリックの後にタイマーをスタートさせることだと思います


-2


通常@MLButtonUpを見れば、同じマウスボタンでシングルクリックやダブルクリックの動作をすることはできません。