|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
12.05.2012, 00:30 | #1 |
Пользователь
Регистрация: 11.05.2012
Сообщений: 85
|
Навязчивое контекстное меню - как избавиться?
Доброго времени суток!
В нормально, в общем-то, работающей программе, сделанной мной с применением средств Visual Studio 2008 (язык C#) и Crownwood DotNetMagic, кроме моих собственных, есть несколько недостатков, пришедших из этих средств разработки, которые известны, наверное, всем и с которыми так или иначе я справился или их обошёл (например, разнобой во внешних видах элементов управления в состояниях enabled и disabled, разные рамки и проч.). Не могу избавиться только от одного дефекта: элементы управления (текстбоксы, датагриды и др.) реагируют на правую клавишу мыши навязчивым выводом какого-то непонятного контекстного меню (см. картинку). Откуда оно берётся, мне неведомо ни сном, ни духом. Если я предусмотрел своё меню, то безо всякого порядка выводится то моё, то это "паразитное" меню, а если у меня нет своего контекстного меню, то всё равно выводится это "паразитное". Подскажите, пожалуйста, как от него избавиться! (Святой водой уже брызгал - не помогло ) Дополнение от 12.05.12 в 19 часов: Путём антинаучного тыка мне удалось установить, что описанное явление встречается только при использовании DotNetMagic, а именно я делаю следующее: 1) Создаю UserControl, наследованный от Crownwood.DotNetMagic.Controls.Tabb edGroups - контейнер, в который будут выводиться табулированные страницы (TabPages) с возможностью их докинга самыми разнообразными способами. 2) Создаю "внутренний контрол" (inner control) будущей таб. страницы - UserControl с именем, предположим, myControl, кстати свойство которого ContextMenuStrip = none, и размещаю на нём элементы ввода/вывода (текстбоксы, комбобоксы и проч.), как обычно делается в форме (System.Windows.Forms.Form). 3) По необходимости динамически создаю методом экземпляра класса, наследованного от TabbedGroups (см. п. 1), его таб. страницу с необходимыми атрибутами (наименованием, внутренним контролом и иконкой): Crownwood.DotNetMagic.Controls.TabP age page = new Crownwood.DotNetMagic.Controls.TabP age(title, myControl as Control, imageList, imageIndex); Всё несколько сложнее, но принцип такой. Так вот, хм. Не в Crownwood.DotNetMagic.Controls.Tabb edGroups ли порылась собака? Не оттуда ли выпирает это непотребное меню прикреплённых к её страницам элементов? Ведь в других случаях никакого такого меню у этих элементов не бывает. С этими меню приложение я никак оставить не могу: мои юзеры горняки и им никакого дела нет до юникода и методов ввода невидимых символов, их главная забота: мышь бы не потерять в ладони. Поэтому очень прошу головы спецов по Crownwood DotNetMagic пошевелить мозгами, не может ли это меню быть наведённым оттуда, и каким образом? Ведь главное понять причину, а не пытаться, не поняв, с нею бороться на авось, как это делаю я. PS Прошу извинить за лишние пробелы, но в этом редакторе побороть их мне не удалось. Последний раз редактировалось Гаврилов; 12.05.2012 в 21:09. |
12.05.2012, 09:21 | #2 |
Форумчанин
Регистрация: 17.02.2010
Сообщений: 399
|
может быть поставить return на событие onmouseclick ? точнее проверку на нажатие пр. кнопки мыши и если нажата то return.
|
12.05.2012, 09:41 | #3 |
Пользователь
Регистрация: 11.05.2012
Сообщений: 85
|
Проверил на нескольких типах. Не помогает!
Видимо, собака глубже зарыта. Кстати, против ожидания, и моё собственное меню тоже выводится, если оно есть. Спасибо. |
12.05.2012, 11:25 | #4 |
Форумчанин
Регистрация: 17.12.2008
Сообщений: 250
|
так пробовали ?
Код:
|
12.05.2012, 12:22 | #5 |
Пользователь
Регистрация: 11.05.2012
Сообщений: 85
|
Я не писал код вручную, а, как обычно, воспользовался автоматизацией, предоставляемой MS Visual Studio, т.е. вытащил контекстное меню из тулбокса (почему бы благородному дону не сделать этого, если им до сих пор, за долгое время в этом не было замечено никакого криминала?). Предлагаю пример датагрида с контекстным меню - как это автоматом отобразилось в методе InitializeComponent().
Был создан DataGridView dg11: this.dg11 = new System.Windows.Forms.DataGridView() ; Независимо от него создано контекстное меню с указанием компонента-контейнера: this.cms11 = new System.Windows.Forms.ContextMenuStr ip(this.components); Созданы при помощи new пункты этого меню: this.gridAddRow = new System.Windows.Forms.ToolStripMenuI tem(); и т.д. и добавлены к меню cms11: this.cms11.Items.AddRange( new System.Windows.Forms.ToolStripItem[] { this.gridAddRow, ... }; Далее следует привязка меню к элементу DataGridView dg11: this.dg11.ContextMenuStrip = this.cms11; По-моему, получилось не хуже, чем Вы предлагаете. К тому же, а что делать с теми элементами, в которых мне не нужно контекстного меню? Ведь это "паразитное" меню там всё равно будет выскакивать. |
13.05.2012, 19:28 | #6 |
Пользователь
Регистрация: 11.05.2012
Сообщений: 85
|
Вот уже более 120 просмотров, а предложений только два, считая детское:
"А не пробовали textBox1.ContextMenu = new ContextMenu();" - (интересно, как ещё может выглядеть в коде создание контекстного меню элемента). Неужели никто не сталкивался с таким явлением? Если кто-нибудь действительно интересуется этой темой, то взгляните, пожалуйста, ещё раз на самую первую мою реплику с просьбой помочь. Там теперь есть существенное дополнение. |
13.05.2012, 20:26 | #7 | |
Форумчанин
Регистрация: 17.12.2008
Сообщений: 250
|
Цитата:
и если вы укажете Код:
Код:
|
|
13.05.2012, 20:27 | #8 |
Пользователь
Регистрация: 11.05.2012
Сообщений: 85
|
ДА, ПРОБОВАЛ.
|
13.05.2012, 20:51 | #9 |
Пользователь
Регистрация: 11.05.2012
Сообщений: 85
|
Уважаемый Reskov! Беру свои слова обратно (насчёт детского предложения) и прошу меня извинить!!!
Ваше предложение действует! Конечно, я знал, что ContextMenu сильнее, чем ContextMenuStrip, который по умолчанию = null. Но я в спешке перекомпилировал проекты и сам Solution только в режиме дебагера, а надо было это сделать и в режиме Release, причём, в первую очередь (классы этих контролов находятся у меня в подчинённом проекте). Теперь я знаю, что мне делать, чтобы решить этот вопрос раз и навсегда. Большое спасибо! PS И всё же интересно чисто по причине любопытства, откуда берутся эти паразитные ContextMenu. Раньше я этого безобразия не наблюдал. |
13.05.2012, 21:30 | #10 |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
стандартные-системные от контрола.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
создать контекстное меню в TextBox как в visual studio | aleks_pilipenko | C# (си шарп) | 2 | 08.12.2011 19:36 |
контекстное меню | J.Bond | Помощь студентам | 3 | 17.06.2010 21:18 |
Контекстное меню | mar4elo | Общие вопросы Delphi | 19 | 18.09.2009 14:30 |
Как добавить свой раздел в стандартное контекстное меню | yaver | Общие вопросы Delphi | 2 | 26.11.2008 19:44 |
Как добавить подменю в системное контекстное меню | Lucky13 | Win Api | 5 | 19.03.2007 20:17 |