VB のたまご

作成日: 2017/02/01, 更新日: 2017/02/01


Form のマウスイベントが発生しないことがある

  •  Form のマウスイベント、今回の件で言うと、動作を期待して実装した MouseEnter, MouseLeave イベントが発生しないという現象に出くわしましたので、情報共有です。 細かく確認していませんが、その他のマウスイベントも該当するのではと思います。 【イベントハンドラを作成して、イベントに登録すれば、イベントは発生する。】という常識がガラガラと崩れていく一件でした。

  •  Form に関わらず、Control 全般でも z オーダーの重なりがあった際は、マウスイベントを扱う際にはご注意を。

  • スポンサーリンク


現象が出る画面設計

  •  Form の上に、SplitContainer やら Panel やら配置して、画面領域を分割したい場合があります。 今回の件で言うと、これを作る際、画像とメッセージの領域を分割する目的で、コンテナ系コントロールを配置していました。 余談ですが、WinForms で、画面リサイズを考慮した複雑な UI を作る際は、SplitContainer, TableLayoutPanel, FlowLayoutPanel, Panel 等々、コンテナを使わないと楽ちんに実装できないくらい、毎度頼りまくっています。

  •  今回の現象が出る簡単な例として、Form の上に Panel を配置した状態( Dock=Fill にしてしまうと完全にイベント発生しない)で、【Formの】マウスイベントを実装してみます。 上記では、MouseEnter, MouseLeave イベントと書きましたが、現象確認のしやすさだと、MouseClick, MouseDoubleClick イベントの方が分かりやすいかもしれません。マウスイベントなら何でもいいです。 イベント内には、Console.WriteLine など、イベント発生したことが分かる目印を仕込んでおけば OK です。

  •  現象の再現方法は、MouseEnter, MouseLeave イベントならマウスカーソルを移動して画面上に入ったり離れたり、MouseClick, MouseDoubleClick イベントならマウスクリックしてみたりしてみてください。 マウスカーソルの直下が Form の場合はイベント発生しますが、マウスカーソルの直下が Panel の場合、イベント発生しない事が確認できるかと思います。

考察

  •  上記挙動から、マウスイベントに関しては、全てのコントロールが感知することはできず、マウス直下となる最前面のコントロールのみ、マウスカーソルを感知して?、マウスイベントが発生するものと考えています。

  • イメージ

  •  今回のサンプルソースは、以下から参照できます。
  •  Github : サンプル

  •  最後まで読んでいただき、ありがとうございました。

  • スポンサーリンク