Создание элемента управления ActiveX для SCADA Vijeo Citect с помощью Microsoft Visual C# 2012

Модификаторы доступа для делегатов и событий должен быть установлен в  «public».

public delegate void OnValueChangedHandler(string propertyname);
public delegate void OnButtonClickedHandler(); 
public delegate void OnSelectionChangedHandler(string selectedvalue);

public event OnValueChangedHandler OnValueChanged;
public event OnButtonClickedHandler OnButtonClicked;
public event OnSelectionChangedHandler OnSelectionChanged;

Теперь события и соответствующие делегаты определены и добавлены, что позволяем нам начать их использовать.

Нам необходимо чтобы определенные события вызывались при изменении состояния элементов пользовательского интерфейса. Для этого нам необходимо подписаться на события соответствующих элементов пользовательского интерфейса. Чтобы это сделать добавим следующий код в конструктор SampleUI (после метода InitializeComponent()):

listBox1.SelectedIndexChanged += new EventHandler(listBox1_SelectedIndexChanged);
btnUpdateProperties.Click += new EventHandler(btnUpdateProperties_Click);
btnClickEvent.Click += new EventHandler(btnClickEvent_Click);

Теперь код конструктора SampleUI будет выглядет так:

public SampleUI()
{
        InitializeComponent();

        listBox1.SelectedIndexChanged += new EventHandler(listBox1_SelectedIndexChanged);
        btnUpdateProperties.Click += new EventHandler(btnUpdateProperties_Click);
        btnClickEvent.Click += new EventHandler(btnClickEvent_Click);
}

А реализация событий так:

void listBox1_SelectedIndexChanged(object sender, EventArgs e)
{
        if (this.OnSelectionChanged != null)
        {
                string selectedValue = listBox1.SelectedItem.ToString();
                this.OnSelectionChanged(selectedValue);
                UpdateListView(string.Format("OnSelectionChanged({0}) event fired!", selectedValue));
        }
}

void btnUpdateProperties_Click(object sender, EventArgs e)
{
        this.StrProperty = txtStrProperty.Text;

        int intValue;
        if (int.TryParse(txtIntProperty.Text, out intValue))
                this.IntProperty = intValue;

        float floatValue;
        if (float.TryParse(txtFloatProperty.Text, out floatValue))
                this.FloatProperty = floatValue;

}

void btnClickEvent_Click(object sender, EventArgs e)
{
        if (this.OnButtonClicked != null)
        {
                this.OnButtonClicked();
                UpdateListView("OnButtonClicked event fired!");
        }
}

Регистрация элемента управления ActiveX

Для того чтобы наш элемент управления ActiveX появился в системном списке элементов управления Windows, его необходимо зарегистрировать, процесс регистрации происходит путем добавления в системный реестр Windows определенных ключей. Это делается с помощью кода приведенного ниже.

Примечание: Наш элемент управления представляет собой .NET сборку, поэтому мы не может её зарегистрировать с помощью утилиты regsvr32.exe. Для регистрации .NET сборки необходимо использовать утилиту RegAsm.exe.

Код регистрации элемента управления ActiveX:

[ComRegisterFunction()]
public static void RegisterClass(string key)
{
        // Удаляем HKEY_CLASSES_ROOT\ из переданного ключа
        StringBuilder sb = new StringBuilder(key);
        sb.Replace(@"HKEY_CLASSES_ROOT\", "");

        // Открываем ключ CLSID\{guid} в режиме записи
        RegistryKey k = Registry.ClassesRoot.OpenSubKey(sb.ToString(), true);

        // Создаем ключ элемента управления ActiveX – это позволяет ему появиться
        //в контейнере элемента управления ActiveX
        RegistryKey ctrl = k.CreateSubKey("Control");
        ctrl.Close();

        // Создаем запись CodeBase
        RegistryKey inprocServer32 = k.OpenSubKey("InprocServer32", true);
        inprocServer32.SetValue("CodeBase", Assembly.GetExecutingAssembly().CodeBase);
        inprocServer32.Close();

        // И в заключении закрываем ключ реестра
        k.Close();
}

[ComUnregisterFunction()]
public static void UnregisterClass(string key)
{
        StringBuilder sb = new StringBuilder(key);
        sb.Replace(@"HKEY_CLASSES_ROOT\", "");

        // Открываем ключ HKCR\CLSID\{guid} в режиме записи
        RegistryKey k = Registry.ClassesRoot.OpenSubKey(sb.ToString(), true);

        // Удаляем ключ элемента управления ActiveX
        k.DeleteSubKey("Control", false);

        // Затем открываем ключ InprocServer32
        RegistryKey inprocServer32 = k.OpenSubKey("InprocServer32", true);

        // Удаляем ключ CodeBase
        k.DeleteSubKey("CodeBase", false);

        // И в заключении закрываем ключ реестра
        k.Close();
}

Делаем .NET сборку видимой

Делаем .NET сборку видимой, шаг 1

Рис. 7. Делаем .NET сборку видимой, шаг 1

Страницы

Теги: