itagagaki
@itagagaki (板垣 史彦)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

CTreeDialogでWM_LBUTTONUPが来ない

Q&A

Closed

WindowsのMFCアプリをメンテナンスしています。

CTreeDialog(の派生クラス)のPreTranslateMessageメソッドでメッセージを受け取っています。

ツリー内の項目のアイコンかラベル上でマウスの左ボタンをクリックしたとき、WM_LBUTTONDOWNは来るのですが、WM_LBUTTONUPが来なくて困っています。

アイコンやラベル上ではない部分でクリックした場合は
WM_LBUTTONDOWN
WM_LBUTTONUP
の順に来ます。しかしながら当然、項目の選択は行われません。

アイコンかラベル上でダブルクリックすると次の順に来ます。
WM_LBUTTONDOWN
WM_LBUTTONDBLCLK
WM_LBUTTONUP

アイコンやラベル以外の部分でのダブルクリックでは次の順に来ます。
WM_LBUTTONDOWN
WM_LBUTTONUP
WM_LBUTTONDBLCLK
WM_LBUTTONUP

1回目のWM_LBUTTONDOWNで項目が選択されたら、その後のWM_LBUTTONUPが来なくなっちゃうのでしょうか…
項目選択時でも左ボタンが離されたイベントを得る方法があれば教えてください。

1

1Answer

あんまり詳しくなくて恐縮ですが

WM_LBUTTONUPはマウスがキャプチャされてたりカーソルの位置によっては変なウィンドウに飛ぶみたいです.
そのコントロールでやってることが悪さしてる可能性もあるかと.

0Like

Comments

  1. @itagagaki

    Questioner

    ありがとうございます。

    ご紹介いただいたgooのアンサーの言うとおり、自分のクラス(派生クラス)でWM_LBUTTONDOWNを受け取ったとき、基底クラスにそれを知らせるのをやめてみたら、WM_LBUTTONUPが来るようになりました。しかしそうすると、これもgooのアンサーで言われているとおり、CTreeDialogが左ボタンに関して行っていることをすべて自分で書かねばならなくなるわけで、これはちょっと無理です…。

    CTreeDialogを使う以上、どうしようもなさそうですね…。

  2. @itagagaki

    Questioner

    WM_LBUTTONUPをが来るのを期待せず、MFCのON_NOTIFY(NM_CLICK, ...)でクリックを捕捉して、その中で工夫するようにしました。

    ツリー項目のアイコンかラベル上でクリックした場合、ボタンを離したときに ON_NOTIFYに登録したハンドラーに来るようです。それ以外のクライアント領域でクリックした場合は、ボタンが押されたときにハンドラーに来ました。つまり来るタイミングが異なります。そしてPreTranslateMessageには、ツリー項目のアイコンかラベル上でクリックした場合はWM_LBUTTONUPは来ず、それ以外のクライアント領域でクリックした場合やダブルクリックで2回目にボタンが離されたときにはWM_LBUTTONUPが来ます。

    ご回答がヒントになりました。ありがとうございました。

Your answer might help someone💌