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

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

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

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

  • ADN Club
  • ****
  • Сообщений: 288
  • Карма: 10
  • AutoCAD Civil 3D
Код - C# [Выбрать]
  1. sb.Update();
не попогает

например какие действия?

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
например какие действия?
Экспериментируй. Попробуй создавать _ti не в функции таймера, а заранее. А вот _ti.ShowBubbleWindow(bubble); вызывать по таймеру.
Возможно _ti.Visible = false; и _ti.Visible = true; приведут к нужному результату. Может поможет Application.DoEvents. Увы, но у себя я это проверить не могу.
 
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • ****
  • Сообщений: 288
  • Карма: 10
  • AutoCAD Civil 3D
О чудо - visible помогло
Код - C# [Выбрать]
  1. _ti.Visible = false;
  2. tic.Add(_ti);
  3. _ti.Visible = true;

Спасибо

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
О чудо - visible помогло
Это не чудо. Это интуиция. :)
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Иконки следует объявлять в коде статическими.

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

  • ADN Club
  • ****
  • Сообщений: 288
  • Карма: 10
  • AutoCAD Civil 3D
Иконки следует объявлять в коде статическими.
Например как?

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
ты не знаешь как в C# создавать статические переменные?

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

  • ADN Club
  • ****
  • Сообщений: 288
  • Карма: 10
  • AutoCAD Civil 3D
я про иконку - может надо как-то по особому )))
На что влияет?

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Насколько я помню, если создавать переменную иконки не static, то она в процессе работы акада вдруг исчезает (не сразу, а через некоторое время) мышкой по экрану подёргай, позуммируй. видимо объект класса уничтожается, а с ним уничтожается и объект иконки. Если её объявлять статической, то проблема исчезает (я где-то писал об этом).

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

  • ADN Club
  • ****
  • Сообщений: 288
  • Карма: 10
  • AutoCAD Civil 3D

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Вот кто-то спотыкался об это же и нашёл то же решение что и я - юзать static.

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
А вот, кстати, и моя тема, с демонстрационным видео этой проблемы (только что нашёл).

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Получил ответ из ADN DevHelp. Они подтвердили наличие бага и передали его команде инженеров. Пока же предложили еще один workaround:
Код - vb.net [Выбрать]
  1.     Private _filter As MenuMsgFilter
  2.  
  3.     <CommandMethod("TrayTest")> _
  4.     Public Sub TrayTest()
  5.  
  6.         Autodesk.AutoCAD.ApplicationServices.Application.StatusBar.TrayItems.Add(Me.TrayItem)
  7.         Autodesk.AutoCAD.ApplicationServices.Application.StatusBar.Update()
  8.  
  9.         _filter = New MenuMsgFilter
  10.         System.Windows.Forms.Application.AddMessageFilter(_filter)
  11.  
  12.     End Sub
  13.  
  14.     '<DebuggerBrowsable(DebuggerBrowsableState.Never)> _
  15.     Private m_TrayItem As Autodesk.AutoCAD.Windows.TrayItem = Nothing
  16.  
  17.     Public ReadOnly Property TrayItem() As Autodesk.AutoCAD.Windows.TrayItem
  18.         Get
  19.             If Me.m_TrayItem Is Nothing Then
  20.  
  21.                 Me.m_TrayItem = New Autodesk.AutoCAD.Windows.TrayItem
  22.                 Me.m_TrayItem.Icon = System.Drawing.SystemIcons.Asterisk
  23.                 Me.m_TrayItem.ToolTipText = "Testing"
  24.                 Me.m_TrayItem.Visible = True
  25.  
  26.                 AddHandler m_TrayItem.MouseDown, AddressOf callback_MouseDown
  27.             End If
  28.             Return Me.m_TrayItem
  29.         End Get
  30.     End Property
  31.  
  32.     <StructLayout(LayoutKind.Sequential)> _
  33.     Private Structure MENUITEMINFO
  34.         Public cbSize As Integer
  35.         Public fMask As Integer
  36.         Public fType As Integer
  37.         Public fState As Integer
  38.         Public wID As Integer
  39.         Public hSubMenu As IntPtr
  40.         Public hbmpChecked As IntPtr
  41.         Public hbmpUnchecked As IntPtr
  42.         Public dwItemData As IntPtr
  43.         Public dwTypeData As String
  44.         Public cch As Integer
  45.         Public hbmpItem As IntPtr
  46.     End Structure
  47.  
  48.     <DllImport("user32.dll")> _
  49.     Private Shared Function GetMenuItemInfo( _
  50.         ByVal hMenu As IntPtr, _
  51.         ByVal uItem As UInteger, _
  52.         ByVal fByPosition As Boolean, _
  53.         ByRef lpmii As MENUITEMINFO) As Boolean
  54.  
  55.     End Function
  56.  
  57.     '<DebuggerBrowsable(DebuggerBrowsableState.Never)> _
  58.     Private m_ContextMenu As System.Windows.Forms.ContextMenu = Nothing
  59.  
  60.     Private m_MenuIds As Dictionary(Of Integer, String)
  61.  
  62.     Private ReadOnly Property ContextMenu() As System.Windows.Forms.ContextMenu
  63.         Get
  64.             If Me.m_ContextMenu Is Nothing Then
  65.  
  66.                 Me.m_ContextMenu = New System.Windows.Forms.ContextMenu
  67.  
  68.                 Dim MenuItem1 As New System.Windows.Forms.MenuItem("MenuItem1")
  69.                 Dim MenuItem2 As New System.Windows.Forms.MenuItem("MenuItem2...")
  70.                 Dim MenuItem3 As New System.Windows.Forms.MenuItem("MenuItem3...")
  71.  
  72.                 'AddHandler MenuItem1.Click, AddressOf MenuItem1_Click
  73.                 'AddHandler MenuItem2.Click, AddressOf MenuItem2_Click
  74.                 'AddHandler MenuItem3.Click, AddressOf MenuItem3_Click
  75.  
  76.                 Me.m_ContextMenu.MenuItems.Add(MenuItem1)
  77.                 Me.m_ContextMenu.MenuItems.Add(MenuItem2)
  78.                 Me.m_ContextMenu.MenuItems.Add(New System.Windows.Forms.MenuItem("-"))
  79.                 Me.m_ContextMenu.MenuItems.Add(MenuItem3)
  80.  
  81.                 Dim mif As MENUITEMINFO = New MENUITEMINFO()
  82.                 mif.cbSize = Marshal.SizeOf(mif)
  83.                 mif.fMask = &H2 'MIIM_ID
  84.                 mif.fType = &H100
  85.                 mif.cch = 256
  86.  
  87.                 m_MenuIds = New Dictionary(Of Integer, String)
  88.  
  89.                 GetMenuItemInfo(Me.m_ContextMenu.Handle, 0, True, mif)
  90.                 m_MenuIds.Add(mif.wID, "MenuItem[1] Clicked!")
  91.  
  92.                 GetMenuItemInfo(Me.m_ContextMenu.Handle, 1, True, mif)
  93.                 m_MenuIds.Add(mif.wID, "MenuItem[2] Clicked!")
  94.  
  95.                 GetMenuItemInfo(Me.m_ContextMenu.Handle, 3, True, mif)
  96.                 m_MenuIds.Add(mif.wID, "MenuItem[3] Clicked!")
  97.  
  98.                 _filter.MenuIds = m_MenuIds
  99.  
  100.             End If
  101.  
  102.             Return Me.m_ContextMenu
  103.         End Get
  104.     End Property
  105.  
  106.     Private Sub callback_MouseDown(ByVal sender As Object, ByVal e As Autodesk.AutoCAD.Windows.StatusBarMouseDownEventArgs)
  107.         Try
  108.             Select Case e.Button
  109.  
  110.                 Case Windows.Forms.MouseButtons.Left
  111.  
  112.                     WriteMsg("left button")
  113.  
  114.                 Case Windows.Forms.MouseButtons.Right
  115.  
  116.                     Dim ti As Autodesk.AutoCAD.Windows.TrayItem = CType(sender, Autodesk.AutoCAD.Windows.TrayItem)
  117.                     ti.DisplayContextMenu(Me.ContextMenu, New System.Drawing.Point(e.X, e.Y))
  118.  
  119.             End Select
  120.         Catch ex As System.Exception
  121.         End Try
  122.  
  123.     End Sub
  124.  
  125.     'Private Sub MenuItem1_Click(ByVal sender As Object, ByVal e As System.EventArgs)
  126.     '    WriteMsg("MenuItem1")
  127.     'End Sub
  128.  
  129.     'Private Sub MenuItem2_Click(ByVal sender As Object, ByVal e As System.EventArgs)
  130.     '    WriteMsg("MenuItem2")
  131.     'End Sub
  132.  
  133.     'Private Sub MenuItem3_Click(ByVal sender As Object, ByVal e As System.EventArgs)
  134.     '    WriteMsg("MenuItem3")
  135.     'End Sub
  136.  
  137.     Private Sub WriteMsg(ByVal msg As String)
  138.         Dim doc As Document = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument
  139.         doc.Editor.WriteMessage(Environment.NewLine & msg)
  140.     End Sub
  141.  
  142.     Private Class MenuMsgFilter
  143.         Implements System.Windows.Forms.IMessageFilter
  144.  
  145.         Private m_MenuIds As Dictionary(Of Integer, String)
  146.  
  147.         Public Property MenuIds() As Dictionary(Of Integer, String)
  148.             Get
  149.                 Return m_MenuIds
  150.             End Get
  151.             Set(ByVal value As Dictionary(Of Integer, String))
  152.                 m_MenuIds = value
  153.             End Set
  154.         End Property
  155.  
  156.         Private Function LoWord(ByVal word As Integer) As Short
  157.             Return CShort(word And Short.MaxValue)
  158.         End Function
  159.  
  160.         Private Function HiWord(ByVal word As Integer) As Short
  161.             Return CShort((word >> 16))
  162.         End Function
  163.  
  164.         Private WM_COMMAND As Integer = &H111
  165.  
  166.         Public Function PreFilterMessage(ByRef m As System.Windows.Forms.Message) As Boolean _
  167.             Implements System.Windows.Forms.IMessageFilter.PreFilterMessage
  168.  
  169.             If m.Msg = WM_COMMAND Then
  170.                 If HiWord(m.WParam) = 0 Then
  171.                     If m_MenuIds.ContainsKey(LoWord(m.WParam)) Then
  172.  
  173.                         Dim msg As String = m_MenuIds(LoWord(m.WParam))
  174.  
  175.                         Dim doc As Document = Application.DocumentManager.MdiActiveDocument
  176.                         Dim ed As Editor = doc.Editor()
  177.  
  178.                         ed.WriteMessage(vbCrLf + msg)
  179.                         Return False
  180.  
  181.                     End If
  182.                 End If
  183.             End If
  184.  
  185.             Return False
  186.         End Function
  187.     End Class
Я не проверял предложенное решение, но мне кажется, что моё решение выглядит проще и элегантнее.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Они подтвердили наличие бага и передали его команде инженеров.
Насколько я помню, они уже не в первый раз это "подтверждают и передают команде инженеров"...

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Насколько я помню, они уже не в первый раз это "подтверждают и передают команде инженеров"...
Так как имеется как минимум два "workaround", нет "business case", то и приоритет у этого исправления не высок.
В очередной раз могу посоветовать почитать: http://adn-cis.org/forum/index.php?topic=2640.0
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение