9.8. Регистрация COM-событий в .Net

Источник здесь[перевод не проверен] ;[Переводчик: Богданов Михаил][Исправил: Андрей Бушман (перевёл текст в коде)]

    Библиотека AutoCAD COM Automation предлагает ряд уникальных событий, которые не встречаются в . NET API. Регистрация событий, находящихся в библиотеке COM отличается от инициализации событий с помощью VB и VBA. Вы можете использовать заявление AddHandle в VB.NET, или оператор +=  в C # для регистрации обработчика событий. Обработчик требует адрес процедуры, которая должна быть вызвана при возникновении события. 

Регистрация базовых событий COM

    Этот пример демонстрирует, как зарегистрировать событие BeginFileDrop с помощью COM-взаимодействия. Событие BeginFileDrop связано с объектом применения библиотеки AutoCAD COM Automation. После того, как команды будут загружены в AutoCAD, введите AddCOMEvent из командной строки, а затем перетащите файл DWG рисунка в окно рисования. Отобразится окно сообщения с запросом на продолжение.

    Используйте команду RemoveCOMEvent для удаления обработчика событий.

Код VB.NET

   1:  Imports Autodesk.AutoCAD.Runtime
   2:  Imports Autodesk.AutoCAD.ApplicationServices
   3:  Imports Autodesk.AutoCAD.DatabaseServices
   4:   
   5:  Imports Autodesk.AutoCAD.Interop
   6:  Imports Autodesk.AutoCAD.Interop.Common
   7:   
   8:  '' Глобальная переменная для команд AddCOMEvent и RemoveCOMEven
   9:  Dim acAppCom As AcadApplication
  10:   
  11:  <CommandMethod("AddCOMEvent")> _
  12:  Public Sub AddCOMEvent()
  13:    '' Присваиваем глобальной переменной ссылку на приложение и
  14:    '' регистрируем обработчик COM-события BeginFileDrop
  15:    acAppCom = Application.AcadApplication
  16:    AddHandler acAppCom.BeginFileDrop, AddressOf appComBeginFileDrop
  17:  End Sub
  18:   
  19:  <CommandMethod("RemoveCOMEvent")> _
  20:  Public Sub RemoveCOMEvent()
  21:    '' Отменяем регистрацию обработчика COM-события
  22:    RemoveHandler acAppCom.BeginFileDrop, AddressOf appComBeginFileDrop
  23:    acAppCom = Nothing
  24:  End Sub
  25:   
  26:  Public Sub appComBeginFileDrop(ByVal strFileName As String, _
  27:                                 ByRef bCancel As Boolean)
  28:    '' Показать окно сообщения с вопросом о том, стоит ли продолжить вставлять DWG-файл
  29:    If System.Windows.Forms.MessageBox.Show("AutoCAD о загрузке файла " & _
  30:                            strFileName & vbLf & _
  31:                            "\nЖелаете продолжить загружать этот файл?", _
  32:                            "Перетащен DWG-файл", _
  33:                            System.Windows.Forms.MessageBoxButtons.YesNo) = _
  34:      System.Windows.Forms.DialogResult.No Then
  35:        bCancel = True
  36:    End If
  37:  End Sub

Код C#

   1:  using Autodesk.AutoCAD.Runtime;
   2:  using Autodesk.AutoCAD.ApplicationServices;
   3:  using Autodesk.AutoCAD.DatabaseServices;
   4:   
   5:  using Autodesk.AutoCAD.Interop;
   6:  using Autodesk.AutoCAD.Interop.Common;
   7:   
   8:  // Глобальная переменная для команд AddCOMEvent и RemoveCOMEvent
   9:  AcadApplication acAppCom;
  10:   
  11:  [CommandMethod("AddCOMEvent")]
  12:  public void AddCOMEvent()
  13:  {
  14:    // Присваиваем глобальной переменной ссылку на приложение и
  15:    // регистрируем обработчик COM-события BeginFileDrop
  16:    acAppCom = Application.AcadApplication as AcadApplication;
  17:    acAppCom.BeginFileDrop += 
  18:        new _DAcadApplicationEvents_BeginFileDropEventHandler(appComBeginFileDrop);
  19:  }
  20:   
  21:  [CommandMethod("RemoveCOMEvent")]
  22:  public void RemoveCOMEvent()
  23:  {
  24:    // Отменяем регистрацию обработчика COM-события
  25:    acAppCom.BeginFileDrop -= 
  26:        new _DAcadApplicationEvents_BeginFileDropEventHandler(appComBeginFileDrop);
  27:    acAppCom = null;
  28:  }
  29:   
  30:  public void appComBeginFileDrop(string strFileName, ref bool bCancel)
  31:  {
  32:    // Показать окно сообщения с вопросом о том, стоит ли продолжить вставлять DWG-файл
  33:    if (System.Windows.Forms.MessageBox.Show("AutoCAD о загрузке файла " + strFileName +
  34:                                         "\nЖелаете продолжить загружать этот файл?",
  35:                                         "Перетащен DWG-файл",
  36:                                         System.Windows.Forms.MessageBoxButtons.YesNo) == 
  37:                                         System.Windows.Forms.DialogResult.No)
  38:    {
  39:        bCancel = true;
  40:    }
  41:  }

Код VBA / ActiveX

   1:  Public WithEvents ACADApp As AcadApplication
   2:  Sub Example_AcadApplication_Events()
   3:      ' Инициализация общедоступной переменной (ACADApp)
   4:      ' которые будут использоваться для перехвата события AcadApplication
   5:      '
   6:      ' Запустите эту процедуру ПЕРВОЙ!
   7:      Set ACADApp = ThisDrawing.Application
   8:  End Sub
   9:  Private Sub ACADApp_BeginFileDrop _
  10:   (ByVal FileName As String, Cancel As Boolean)
  11:      ' Эта процедура перехватывает событие BeginFileDrop объекта 
Application
.
  12:      '
  13:      ' Это событие срабатывает, когда файл чертежа перетаскивается мышью
  14:      ' в AutoCAD.
  15:      '
  16:      ' Чтобы запустить этот пример события нужно:
  17:      ' 1) Запустить процедуру Example_AcadApplication_Events для инициализации
  18:      ' общедоступной переменной ACADApp связанной с этим событием.
  19:      '
  20:      ' 2) Перетащить чертёж в AutoCAD из Рабочего стола Windows
  21:      ' или из Проводника Windows
  22:      ' 
  23:      '
  24:      ' Используйте переменную "Cancel" для того, чтобы остановить загрузку
  25:      ' перетащенного файла, и переменную "FileName" для сообщения
  26:      ' пользователю о том, какой файл был перетащен мышью.
  27:   
  28:      If MsgBox("
AutoCAD о загрузке файла 
" & FileName & vbCrLf _
  29:                & "
\nЖелаете продолжить загружать этот файл?
", _
  30:                vbYesNoCancel + vbQuestion) <> vbYes Then
  31:          Cancel = True
  32:      End If
  33:  End Sub



Comments