0

プロジェクトにCOleControlオブジェクトがあります。このCOleControl内には、CRectTrackerオブジェクトがあります。

WM_LButtonUpのWindowsメッセージ(イベント)を処理したい。(ユーザーがマウスの左ボタンを押すのをやめたとき)。

私の.hファイルに私は書いた:

afx_msg void OnLButtonUp(UINT nFlags, CPoint point);

私の.cppファイルでは、

BEGIN_MESSAGE_MAP(CMyControl, COleControl)

追加した

ON_WM_LBUTTONUP()

それから私は

void CMyControl::OnLButtonUp(UINT nFlags, CPoint point) 

WindowsメッセージLButtonDownに対しても同じことをしました。

コントロール内にマウスの左ボタンを置いたままにすると、メソッドgetハンドルが実行され、すべてが正常に機能します。この問題は、マウストラッカーがCRectTrackerオブジェクト上にあるときにマウスの左ボタンを離すと発生します。この場合、マウスのLButtonUpメッセージは処理されません。

Spy ++を使用しようとしましたが、WindowsメッセージWM_LButtonUpが存在し、期待どおりに表示されることがわかります。しかし、それは私のコードであり、処理されません(CRectTracker上のマウスの場合のみ)。

マウスがCRectTracker上にあるときにマウスボタンを押しても、LButtonDownイベントは常に正常に処理されます。

LButtonUpメッセージの何が問題になる可能性がありますか?

ありがとう

4

1 に答える 1

0

これは、トラッカーの動作方法の避けられない副作用です。トラッカーまたはサイジングハンドルの1つをクリックすると、MFCはマウスをキャプチャし、モーダルメッセージループを開始します。これは、追跡操作を実装するためにマウス移動メッセージとボタンアップメッセージをピックオフします。そのループは、左ボタンアップメッセージが表示されるか、Escapeキーが表示されるか、キャプチャが失われるまで終了しません。したがって、そのループがアクティブである間はOnLButtonUp()関数を実行できず、メッセージがディスパッチされる前にインターセプトされました。

OnLButtonUp()に依存せずに、これを別の方法で行う必要があります。あなたがそれを必要とする理由を説明しなかったので、具体的なアドバイスを与えるのは難しいです。モーダルループのソースコードは、詳細が必要な場合はatlmfc / src / mfc / trckrect.cpp、CRectTracker :: TrackHandle()にあります。

于 2013-01-23T13:31:58.547 に答える