2

私自身の理由があまりにも怪しすぎることに気づいたので、私は今、これについて別の方法で行っています. しかし、私はまだ興味があります...

懐かしさ、親しみやすさ、怠惰さの理由から、私は MFC を使用して UI をコーディングしています。疑わしい理由で (それだけでは不十分であるかのように)、グループ ボックスに (ダブル) クリック イベントを追加したいと考えました。当然のことながら、グループ ボックスにはさまざまなものが含まれています。実際には、(ダブル) クリック イベント ハンドラーを正常に追加できる別の静的項目が含まれています。

単純なテキストの静的アイテムの場合と同じように、グループ ボックスのクリックに対してイベント ハンドラーを動作させることができない理由はありますか? コントロール内またはコントロールの近くをクリックしても、イベントは発生しません。

注 - http://www.codeproject.com/KB/static/staticctrl_tut.aspxを読み、通知スタイルを設定して、ON_STN_... イベントと ON_BN_... メッセージの両方に応答しようとしました (BS_NOTIFY はrc ファイル)...それでもまだ何かが欠けています - それは何ですか? それは可能ですか?私がグーグルで検索したことのほとんどは、それが.

この質問を最初に投稿して以来、WM_NCHITTEST メッセージへの参照を見つけました。このメッセージのハンドラーを作成して、HT_TRANSPARENT で応答するグループ ボックスの既定の動作をオーバーライドする必要があることを示唆しています... ClassWizard で透明なプロパティが設定されているにもかかわらず偽に。うーん。これが本当に鍵であることを誰かが確認できますか?

4

1 に答える 1

1

ここでは WM_NCHHITTEST/HT_TRANSPARENT が鍵だと思います。

グループ ボックスは奇妙な種類のコントロールです。グループ ボックスには他のコントロールが含まれているように見えますが、実際には HWND ツリー内のこれらのコントロールの兄弟です。したがって、2 つのボタンが含まれているように見えるグループボックスは、実際にはそれらのボタンの兄弟であり、HWND 階層内でその前または後に来る可能性があります。

グループ ボックスは WM_NCHITTEST に HT_TRANSPARENT で応答するため、マウス クリックはグループ ボックスを通過します。これの利点の 1 つは、グループ ボックスがウィンドウ順序で含まれているように見えるコントロールの前か後かは問題にならないことです。クリックは、グループボックスではなく、これらのコントロールにルーティングされます。

グループボックスをダブルクリック (または単純にクリック) できるようにするには、次の 2 つのことを行う必要があります。

  • デフォルトの WM_NCHITTEST の動作をオーバーライドし、代わりに通常のコントロールのように HT_CLIENT を返します
  • ; この時点で、WM_LBUTTONDOWN および関連するイベントを他の場所 (兄弟またはダイアログ自体) に取得できる必要があります。
  • グループボックスのコンテンツが HWND z オーダーの *前* にあることを確認して、グループボックスを「通過する」クリックに依存しないようにします。(少なくとも、以前の状態にしたいと思います。いずれにせよ、HWND の順序が再び重要になったため、HWND の順序付けをいじる必要があるかもしれません。)

これは WS_EX_TRANSPARENT とは異なるタイプの透過性であることに注意してください。これは、Transparent クラスのウィザード プロパティがマップするものである可能性があります。非常に単純化された HT_TRANSPARENT は、マウスに対して透過的であることと関係があります。WS_EX_TRANSPARENT は、兄弟が「透けて見える」ように最後にペイントすることに関するものです。

于 2011-04-03T14:58:48.543 に答える