WinForm: объединение ContextMenuStrip MenuItem с существующим меню в VS2010 - PullRequest
2 голосов
/ 07 июня 2011

Я добавил несколько пользовательских MenuItem объектов в ContextMenuStrip элемент управления.

Однако добавление моих объектов полностью уничтожило очень полезные пункты меню, которые уже существовали в элементах управления (TreeView, TextBox и DataGridView).

Кто-нибудь смог успешно объединить эти элементы?

1 Ответ

1 голос
/ 07 июня 2011

Нет, вы не можете объединить их. Вам придется самостоятельно продублировать функциональность, добавив соответствующие пункты меню и написав необходимый код в их Click методах обработки событий.

Общие элементы управления предоставляют это меню по умолчанию. Если вы хотите переопределить его, вы можете сделать это, но нет встроенного условия для комбинирования ваших пользовательских элементов со встроенным меню. Некоторые воспользовались этим как функция , назначающая пустой ContextMenu или ContextMenuStrip элементу управления, чтобы предотвратить отображение стандартного меню (говорите о запутанном дизайне пользовательского интерфейса!).

В частности, для элемента управления TextBox я настоятельно рекомендую оставить контекстное меню по умолчанию как есть, а не пытаться заново его создать. Есть много вариантов, которые он предлагает для таких вещей, как IME, которые очень трудно понять правильно. Если вы нацеливаете свое приложение на широкую публику, они очень оценят, что такая функциональность существует в вашем приложении, как и ожидалось.

Лучше всего размещать пользовательские функции где-то еще. Щелчок правой кнопкой мыши по общему элементу управления и ожидание просмотра списка пользовательских параметров довольно не интуитивно понятен. Большинство других приложений не работают именно по этой причине.


Если, несмотря на мои рекомендации об обратном, вы очень настаивали на том, чтобы заставить это работать, вы можете воспользоваться тем, что встроенное контекстное меню - это просто стандартное всплывающее меню Win32, которое отображается всеми общих элементов управления, и эти элементы управления отправляют своим родителям WM_INITMENUPOPUP сообщение , когда всплывающее меню собирается стать активным.

Вооружившись этими знаниями, вы можете решить P / Invoke некоторых функций из Windows API и изменить это контекстное меню. В частности, функции AppendMenu или SetMenuIteminfo.

Но тогда вас ждет сюрприз. Оказывается, что собственный элемент управления Edit (представитель которого TextBox является представителем) не отправляет WM_INITMENUPOPUP сообщение ! Я не уверен насчет элемента управления TreeView, и элемент управления DataGridView не будет делать любого этого, потому что это пользовательский класс, написанный для WinForms. Он вообще не основан ни на одном из собственных элементов управления Win32, поэтому он не будет отправлять такие сообщения, которые вы можете обработать.

...