コントロールにいくつかのカスタムMenuItem
オブジェクトを追加しましたContextMenuStrip
。
TreeView
ただし、オブジェクトを追加すると、コントロール ( 、TextBox
、および)に既に存在していた非常に便利なメニュー項目が完全に吹き飛ばされてしまいましたDataGridView
。
これらのアイテムをうまくマージできた人はいますか?
コントロールにいくつかのカスタムMenuItem
オブジェクトを追加しましたContextMenuStrip
。
TreeView
ただし、オブジェクトを追加すると、コントロール ( 、TextBox
、および)に既に存在していた非常に便利なメニュー項目が完全に吹き飛ばされてしまいましたDataGridView
。
これらのアイテムをうまくマージできた人はいますか?
いいえ、それらをマージすることはできません。Click
適切なメニュー項目を追加し、イベントハンドラーメソッドに必要なコードを記述して、機能を自分で複製する必要があります。
共通コントロールは、デフォルトでそのメニューを提供します。オーバーライドしたい場合はオーバーライドできますが、カスタムアイテムを組み込みメニューと組み合わせるための組み込みプロビジョニングはありません。一部の人はこれを機能ContextMenu
として利用し、標準メニューが表示されないようにするために空またはコントロールを割り当てContextMenuStrip
ています(UIデザインの混乱について話してください!)。
TextBox
特にコントロールについては、デフォルトのコンテキストメニューを再作成するのではなく、そのままにしておくことを強くお勧めします。IMEのように、自分で正しく理解するのが非常に難しいものについては、多くのオプションが公開されています。アプリケーションを一般の人々に向けている場合、そのような機能が期待どおりにアプリに存在することを彼らは非常に高く評価します。
カスタム機能を完全に別の場所に配置することをお勧めします。共通のコントロールを右クリックして、カスタムオプションのリストが表示されることを期待するのは、かなり直感的ではありません。他のほとんどのアプリケーションは、まさにこの理由でそのようには機能しません。
それとは反対の私の推奨にもかかわらず、これを機能させることに固執した場合は、組み込みのコンテキストメニューがすべての一般的なユーザーによって表示される標準のWin32ポップアップメニューであるという知識を利用することができます。コントロール、およびそのコントロールは、ポップアップメニューがアクティブになろうとしているときに親にWM_INITMENUPOPUP
メッセージを送信します。
その知識があれば、WindowsAPIからいくつかの関数をP/ Invokeして、そのコンテキストメニューを変更することができます。特に、AppendMenu
またはSetMenuIteminfo
関数。
しかし、その後、驚きがあなたを待っています。ネイティブのEditコントロール(TextBox
の代表)はメッセージを送信しないことがWM_INITMENUPOPUP
わかりました!TreeView
コントロールについてはよくわかりません。WinForms用に作成されたカスタムクラスであるため、DataGridView
コントロールはこれを実行しません。ネイティブのWin32コントロールにまったく基づいていないため、処理できるようなメッセージは送信されません。