2

コントロールにいくつかのカスタムMenuItemオブジェクトを追加しましたContextMenuStrip

TreeViewただし、オブジェクトを追加すると、コントロール ( 、TextBox、および)に既に存在していた非常に便利なメニュー項目が完全に吹き飛ばされてしまいましたDataGridView

これらのアイテムをうまくマージできた人はいますか?

4

1 に答える 1

1

いいえ、それらをマージすることはできません。Click適切なメニュー項目を追加し、イベントハンドラーメソッドに必要なコードを記述して、機能を自分で複製する必要があります。

共通コントロールは、デフォルトでそのメニューを提供します。オーバーライドしたい場合はオーバーライドできますが、カスタムアイテムを組み込みメニューと組み合わせるための組み込みプロビジョニングはありません。一部の人はこれを機能ContextMenuとして利用し、標準メニューが表示されないようにするために空またはコントロールを割り当てContextMenuStripています(UIデザインの混乱について話してください!)。

TextBox特にコントロールについては、デフォルトのコンテキストメニューを再作成するのではなく、そのままにしておくことを強くお勧めします。IMEのように、自分で正しく理解するのが非常に難しいものについては、多くのオプションが公開されています。アプリケーションを一般の人々に向けている場合、そのような機能が期待どおりにアプリに存在することを彼らは非常に高く評価します。

カスタム機能を完全に別の場所に配置することをお勧めします。共通のコントロールを右クリックして、カスタムオプションのリストが表示されることを期待するのは、かなり直感的ではありません。他のほとんどのアプリケーションは、まさにこの理由でそのようには機能しません。


それとは反対の私の推奨にもかかわらず、これを機能させることに固執した場合は、組み込みのコンテキストメニューがすべての一般的なユーザーによって表示される標準のWin32ポップアップメニューであるという知識を利用することができます。コントロール、およびそのコントロールは、ポップアップメニューがアクティブになろうとしているときに親にWM_INITMENUPOPUPメッセージを送信します。

その知識があれば、WindowsAPIからいくつかの関数をP/ Invokeして、そのコンテキストメニューを変更することができます。特に、AppendMenuまたはSetMenuIteminfo関数。

しかし、その後、驚きがあなたを待っています。ネイティブのEditコントロール(TextBoxの代表)はメッセージを送信しないことがWM_INITMENUPOPUPわかりました!TreeViewコントロールについてはよくわかりません。WinForms用に作成されたカスタムクラスであるため、DataGridViewコントロールはこれを実行しませんネイティブのWin32コントロールにまったく基づいていないため、処理できるようなメッセージは送信されません。

于 2011-06-07T14:42:03.313 に答える