WinForm: объединение ContextMenuStrip MenuItem с существующим меню в VS2010
Я добавил несколько пользовательских MenuItem
возражает против ContextMenuStrip
контроль.
Однако добавление моих объектов полностью уничтожило очень полезные пункты меню, которые уже существовали в элементах управления (TreeView
, TextBox
, а также DataGridView
).
Кто-нибудь смог успешно объединить эти предметы?
1 ответ
Нет, вы не можете их объединить. Вам придется дублировать функциональность самостоятельно, добавив соответствующие пункты меню и написав необходимый код в их Click
методы обработчика событий.
Общие элементы управления предоставляют это меню по умолчанию. Если вы хотите переопределить его, вы можете сделать это, но нет встроенного условия для объединения ваших пользовательских элементов со встроенным меню. Некоторые воспользовались этим как функцией, назначив пустой ContextMenu
или же ContextMenuStrip
к элементу управления, чтобы предотвратить отображение стандартного меню (поговорим о запутанном дизайне пользовательского интерфейса!).
Для TextBox
В частности, я настоятельно рекомендую оставить контекстное меню по умолчанию как есть, а не пытаться заново его создать. Есть много вариантов, которые он предлагает для таких вещей, как IME, которые чрезвычайно трудно понять правильно. Если вы нацеливаете свое приложение на широкую публику, они очень оценят, что такая функциональность существует в вашем приложении, как и ожидалось.
Лучше всего размещать пользовательские функции где-то еще. Щелкнув правой кнопкой мыши по общему элементу управления и ожидая увидеть список настраиваемых опций, довольно не интуитивно. Большинство других приложений не работают именно по этой причине.
Если, несмотря на мои рекомендации об обратном, вы очень настаивали на том, чтобы заставить это работать, вы могли бы воспользоваться знанием того, что встроенное контекстное меню - это просто стандартное всплывающее меню Win32, которое отображается всеми общими элементы управления, и эти элементы управления отправляют их родителю WM_INITMENUPOPUP
сообщение, когда всплывающее меню собирается стать активным.
Вооружившись этими знаниями, вы можете решить вызвать P/Invoke некоторых функций из Windows API и изменить это контекстное меню. В частности, AppendMenu
или же SetMenuIteminfo
функции.
Но тогда вас ждет сюрприз. Оказывается, что родной элемент управления Edit (который TextBox
является представителем) не отправляет WM_INITMENUPOPUP
сообщение! Я не уверен насчет TreeView
контроль, а DataGridView
control не будет ничего делать, потому что это собственный класс, написанный для WinForms. Он вообще не основан ни на одном из собственных элементов управления Win32, поэтому он не будет отправлять такие сообщения, которые вы можете обработать.