Не срабатывает действие в контекстном меню из StatusBar ?

Автор Тема: Не срабатывает действие в контекстном меню из StatusBar ?  (Прочитано 14266 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

Оффлайн DoublefishАвтор темы

  • ADN Club
  • ****
  • Сообщений: 288
  • Карма: 10
  • AutoCAD Civil 3D
http://adndevblog.typepad.com/autocad/2012/06/setting-up-a-timer-in-a-net-sample-that-uses-the-autocad-net-api.html

Добавил контекстное меню, оно появляется, но при нажатии на пункт меню ничего не происходит, MenuOnClick не срабатывает (окно с текстом test click не появляется), отладчик не реагирует - почему? (это отдельный вопрос из этой темы )

В MyBubbleTimer_Tick добавил строку:
Код - C# [Выбрать]
  1.  _ti.MouseDown += new StatusBarMouseDownEventHandler(MouseDown);

Код - C# [Выбрать]
  1. void MouseDown(object sender, StatusBarMouseDownEventArgs e)
  2.         {
  3.             System.Windows.Forms.ContextMenu contextMenu = new System.Windows.Forms.ContextMenu();
  4.             contextMenu.Name = "my menu";
  5.            System.Windows.Forms.Menu.MenuItemCollection cm = new System.Windows.Forms.Menu.MenuItemCollection(contextMenu);
  6.             cm.Add("test click", new EventHandler(MenuOnClick));
  7.             _ti.DisplayContextMenu(contextMenu, new System.Drawing.Point(e.X, e.Y));
  8.         }
  9.            
  10. void MenuOnClick(object obj, EventArgs e)
  11.         {
  12.            MessageBox.Show("test click");
  13.         }

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Выкладывай полностью код для проверки.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн DoublefishАвтор темы

  • ADN Club
  • ****
  • Сообщений: 288
  • Карма: 10
  • AutoCAD Civil 3D
Да, наверное лучше  zip тестового проекта.
« Последнее редактирование: 20-08-2015, 11:39:32 от Doublefish »

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Я просил полный исходный текст. Если так не понятно, то давай полный проект (в zip-архиве).
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн DoublefishАвтор темы

  • ADN Club
  • ****
  • Сообщений: 288
  • Карма: 10
  • AutoCAD Civil 3D
Обновил сообщение и приложил zip.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Похоже на (уже) известный баг. Андрей Бушман уже на него натыкался ( http://www.theswamp.org/index.php?topic=39707.0) и дал альтернативное решение ( http://www.theswamp.org/index.php?topic=43077.0 )
Отправлю этот вопрос в ADN DevHelp.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Отмечено как Решение Doublefish 21-08-2015, 10:39:37

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Я придумал альтернативу для метода DisplayContextMenu:
Код - C# [Выбрать]
  1.     void _ti_MouseDown(object sender, StatusBarMouseDownEventArgs e)
  2.     {
  3.       System.Windows.Forms.ContextMenu contextMenu = new System.Windows.Forms.ContextMenu();
  4.       contextMenu.Name = "my menu";
  5.       contextMenu.MenuItems.Add("test click", new EventHandler(MenuOnClick));
  6.       // _ti.DisplayContextMenu(contextMenu, new System.Drawing.Point(e.X, e.Y));
  7.       this.Location = Cursor.Position;  this.Show();
  8.       contextMenu.Show(this, new System.Drawing.Point(0, 0));
  9.       this.Hide();
  10.     }
  11.  
Посмотри приложенный проект. Возможности детально протестировать не было. Проверял только в AutoCAD 2013.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн DoublefishАвтор темы

  • ADN Club
  • ****
  • Сообщений: 288
  • Карма: 10
  • AutoCAD Civil 3D
О чудо - обработчик контекстного меню стал отзываться.
Хотелось бы узнать в последствии что ответили в ADN DevHelp по этому поводу))

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
О чудо - обработчик контекстного меню стал отзываться.
Я правильно понимаю, что предложенный мной вариант тебя устроил?
Хотелось бы узнать в последствии что ответили в ADN DevHelp по этому поводу))
Мне это тоже интересно, хотя я уже сейчас догадываюсь (на 90%) какой будет ответ: "Так как метод DisplayContextMenu - это "обертка" над функцией ObjectARX AcStatusBarItem::DisplayContextMenu, которая оперирует MFC классом CMenu, аналога которому в .NET нет, то у нас нет возможности реализовать этот метод..."
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн DoublefishАвтор темы

  • ADN Club
  • ****
  • Сообщений: 288
  • Карма: 10
  • AutoCAD Civil 3D
Думаю, что такой вариант подходит. Спасибо.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Запрос в ADN DevHelp отправил.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн DoublefishАвтор темы

  • ADN Club
  • ****
  • Сообщений: 288
  • Карма: 10
  • AutoCAD Civil 3D
Ещё один момент - при первом срабатывании таймера все иконки в трее  становятся одинаковыми (например меняется иконка изоляции объектов на ту что задана в проекте), при втором срабатывании таймера иконки становятся нормальными. Как сделать чтобы при первом срабатывании таймера иконки не становились в трее одинаковыми?

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
У меня такого не происходит. Возможно это баг Civil3D. Проверь на моём коде.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн DoublefishАвтор темы

  • ADN Club
  • ****
  • Сообщений: 288
  • Карма: 10
  • AutoCAD Civil 3D
Проверил с вашим кодом - проблема есть
Поставьте
Код - C# [Выбрать]
  1. _MyTimer.Interval = 10000;
через 10 сек иконки меняются и выглядит не красиво, если окно автокада свернуть развернуть или в модели колесом мыши подвигать модель или закрыть всплывающее сообщение по крестику, то иконка  изолированных объектов становиться нормальной

Я проверял в автокаде в составе Civil 3D, а в обычном автокаде этой проблемы нет?

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Я проверял в автокаде в составе Civil 3D, а в обычном автокаде этой проблемы нет?
У меня нет. Попробуй выполнить действие, которое приводит к перерисовке, программно.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение