2

我在控件中添加了一些自定义MenuItem对象ContextMenuStrip

但是,添加我的对象已经完全消除了控件中已经存在的非常有用的菜单项(TreeViewTextBoxDataGridView)。

有没有人能够成功合并这些项目?

4

1 回答 1

1

不,你不能合并它们。您必须自己复制功能,方法是添加适当的菜单项并在其Click事件处理程序方法中编写必要的代码。

通用控件默认提供该菜单。如果你想覆盖它,你可以这样做,但是没有内置的规定可以你的自定义项目与内置菜单结合起来。有些人利用这个特性,为控件分配一个空的ContextMenuContextMenuStrip以防止标准菜单被显示(谈论令人困惑的 UI 设计!)。

特别是对于TextBox控件,我强烈建议您保留默认上下文菜单,而不是尝试重新创建它。它为 IME 之类的东西提供了很多选项,这些选项自己很难做到。如果您的应用程序面向公众,他们会非常感谢您的应用程序中存在这样的功能,如预期的那样。

最好将您的自定义功能完全放在其他地方。右键单击一个公共控件并期望看到一个自定义选项列表是非常不直观的。正是由于这个原因,大多数其他应用程序都不能以这种方式工作。


如果尽管我的建议与此相反,您仍然坚持要让它工作,您可能会利用内置上下文菜单只是一个标准 Win32 弹出菜单的知识,它由所有常见的控件,并且该控件在弹出菜单即将变为活动状态时向其父级发送WM_INITMENUPOPUP消息。

有了这些知识,您可能会决定从 Windows API 中 P/Invoke 一些函数并修改该上下文菜单。特别是AppendMenuorSetMenuIteminfo函数。

但接下来,会有惊喜等着你。原来,原生Edit控件(TextBox代表)不发送WM_INITMENUPOPUP消息!我不确定该TreeView控件,并且该DataGridView控件不会执行任何操作,因为它是为 WinForms 编写的自定义类。它根本不基于任何本机 Win32 控件,因此它不会发送任何您可以处理的此类消息。

于 2011-06-07T14:42:03.313 回答