ドナドナされるプログラマのメモ

Windows用アプリのプログラミングメモ

ダイアログのコントロール上でも右クリックでメニューを出したい

ダイアログ上で右クリックした際にメニューを表示するには、OnRButtonUpあたりをオーバーライドしてやればいい。しかし、OnRButtonUpはダイアログ上のプログレスバー等の上で右クリックした場合には呼び出されない。これは、ボタンの上で左クリックした場合等を考えると当然の挙動である。

これを解決する方法は2つある。

  1. 各コントロールのクラス(CButton等)を継承したクラスを自作しOnRButtonUpを実装する
  2. 各コントロールのOnRButtonUpを呼び出す処理に割り込む

今回のように、どのコントロールの上で右クリックしてもメニューを出す場合は2.が圧倒的に楽である。では、OnRButtonUpを呼び出す処理に割り込むにはどうすればいいか?MFCではWindowProc()をオーバーライドすればよい。Spy++でメッセージの流れを見たところ、WM_SETCURSORをトリガーに各コントロールのOnRButtonUpを呼び出しているようなので、これに割り込むことにする。

f:id:donadonasan:20180829195728p:plain

以下、サンプルコード。

gist4ebf951cb429e8a6fc482f2dc5f980ea