Чтобы свойства и методы предоставляемые интерфейсом стали доступны для приложений, необходимо добавить к определению интерфейса модификатор доступа «public», как показано ниже.
public interface IMyFirstActiveX
Давайте определим для нашего интерфейса следующие свойства и методы:
- Свойства:
- Имя: StrProperty Тип данных: string
- Имя: IntProperty Тип данных: int
- Имя: FloatProperty Тип данных: float
- Методы:
- SampeMethod ()
- SampleMethodWithArgs (string arg1)
При определении свойств и методов интерфейса необходимо использовать атрибут [DispId(n)], который должен быть уникальным в его пределах. Итак, вот что у нас должно получиться:
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.InteropServices;
namespace MyFirstActiveX
{
[ComVisible(true)]
[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
[Guid("281206BC-9115-44D8-95F9-D9EF76EE27C2")]
public interface IMyFirstActiveX
{
#region Properties
// Здесь определяем предоставляемые элементом управления ActiveX...
[DispId(1)]
string StrProperty { get; set; }
[DispId(2)]
int IntProperty { get; set; }
[DispId(3)]
float FloatProperty { get; set; }
#endregion
#region Methods
// Здесь определяем предоставляемые элементом управления ActiveX методы...
[DispId(4)]
void SampleMethod();
[DispId(5)]
void SampleMethodWithArgs(string arg1);
#endregion
}
}
Определение событий
Элементы управления ActiveX могут иметь события. Предоставление событий клиентам позволяем последним подписаться на них и получать извещения об их возникновении. Для того сделать доступным подписку на события нашего элемента управления ActiveX, нам необходимо добавить интерфейс, аналогичный интерфейсу свойств и методов. В это раз, мы дадим нашему интерфейсу имя IMyFirstActiveXEvents.
Как уже упоминалось ранее, при создании интерфейса свойств и методов мы должны:
- Задать следующие атрибуты для интерфейса:
- [ComVisible(true)]
- [InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
- [Guid("56DA4D66-EED8-4C22-A81E-47C435B43F51")]
- Установить модификатор доступа для интерфейса как «public»
- Задать каждому событию уникальный атрибут [DispId(n)]
В нашем случае мы определим следующие события:
- OnValueChanged //Возникает когда изменилось значение свойства
- OnSelectionChanged //Возникает когда выбирается другой элемент
- OnButtonClicked //Возникает когда щелкнули по кнопке
Вот код получившегося интерфейса событий:
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.InteropServices;
[ComVisible(true)]
[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
[Guid("56DA4D66-EED8-4C22-A81E-47C435B43F51")]
public interface IMyFirstActiveXEvents
{
[DispId(1)]
void OnValueChanged(string propertyname);
[DispId(2)]
void OnSelectionChanged(string selectedvalue);
[DispId(3)]
void OnButtonClicked();
}
Пользовательский интерфейс
Теперь, когда мы определились со свойствами, методами и событиями элемента управления ActiveX, которые он будет предоставлять приложениям, давайте создадим пользовательский интерфейс для него.
Мы будет использовать пользовательский интерфейс для отображения и изменения значений свойств элемента управления ActiveX, инициирования возникновения событий, а также индикации когда методы вызываются клиентом.
Итак, добавим новый элемент в проект, используя шаблон Пользовательский элемент управления (User Control). Присвоим ему имя «SampleUI», как показано на рис. 5.
Рис. 5. Добавление в проект на Visual Studio 2012 пользовательского элемента управления?
Пользовательский интерфейс будет состоять из следующих элементов управления:
- Listbox
- Name: listBox1
- Items:
- Элемент 1
- Элемент 2
- Элемент 3
- Элемент 4
- Элемент 5
- Groupbox
- 3 x Labels
- Name: label1; Text: Свойство Str:
- Name: label2; Text: Свойство Int:
- Name: label3; Text: Свойство Float:
- 3 x Textbox
- Name: txtStrProperty
- Name: txtIntProperty
- Name: txtFloatProperty
- 1 x Button:
- Name: btnUpdateProperties
- Text: Обновить свойства
- 3 x Labels
- Button
- Name: btnClickEvent
- Text: Инициировать событие OnButtonClick
- ListView
- Name: listView1
- Columns:
- Name: TimeStamp; Text: Метка времени
- Name: Details; Text: Сообщение