Создание ActiveX-элементов средствами ATL. Добавление события

   
На этом шаге мы рассмотрим алгоритм добавления событий .

   
Теперь перейдем к реализации событий Click и Jackpot в элементе управления. Чтобы понять, как
реализуются СОМ-события, откройте IDL-файл проекта (OneArmedBanditATL.idl) и просмотрите
определение библиотеки типов. Оно приведено ниже.

[
	uuid(101D4AD7-1664-4B7D-892C-F80F09DF6736),
	version(1.0),
	helpstring("OneArmedBanditATL 1.0 Type Library")
]
library ONEARMEDBANDITATLLib
{
	importlib("stdole32.tlb");
	importlib("stdole2.tlb");

	[
		uuid(DBCF419B-E964-46DF-A213-61B77437A14E),
		helpstring("_IATLBanditEvents Interface")
	]
	dispinterface _IATLBanditEvents
	{
		properties:
		methods:
	};

	[
		uuid(C2EC69E2-0750-413E-AD83-BB8EB3DB9A27),
		helpstring("ATLBandit Class")
	]
	coclass ATLBandit
	{
		[default] interface IATLBandit;
		[default, source] dispinterface _IATLBanditEvents;
	};
};

   
В определении библиотеки типов ONEARMEDBANDITATLLIB имеется определение диспетчерского интерфейса
_IATLBanditEvents. Этот интерфейс объявлен внутри блока сокласса ATLBandit, что свидетельствует о
том, что элемент управления ATLBandit предоставляет интерфейс _IATLBanditEvents. Обратите, однако,
внимание, что этот интерфейс объявлен с IDL-атрибутом [source], указывающим, что _IATLBanditEvents работает
в качестве источника событий. Этот вид интерфейса известен как точка стыковки (connection point).
COM-объекты, предоставляющие точки стыковки, реализуют интерфейс IConnectionPointContainer,
управляющий подключением интерфейсов источников событий к соответствующему объекту-клиенту - приемнику
(sink). Приемник реализует методы, определяемые объектом-источником. Механизм точек стыковки позволяет
передавать источнику указатель на интерфейс приемника, таким образом предоставляя источнику доступ к методам
приемника. Для генерации события источник вызывает соответствующий метод интерфейса приемника.

   
Первый этап определения события - создание представляющего его метода в интерфейсе источника.

  • Добавление методов событий Click() и Jackpot().
  • В ClassView щелкните правой кнопкой мыши узел интерфейса _IATLBanditEvents и в
    контекстном меню выберите Add Method.
  • Выберите void в качестве возвращаемого значения. Введите имя метода - Click.
    Рис.1. Добавление метода Click
  • Повторите такую же последовательность операций для создания метода Jackpot типа void.
  • После создания методов событий в интерфейсе источника обратитесь к ATL Wizard для реализации точки стыковки.
    Для этого ATL использует информацию из библиотеки типов, поэтому прежде придется откомпилировать библиотеку типов.

  • Компиляция библиотеки типов.
  • Перейдите в FileView и найдите файл OneArmedBanditATL.idl.
  • Щелкните правой кнопкой мыши OneArmedBanditATL.idl и в открывшемся меню выберите Compile OneArmedBanditATL.idl.
  • Завершив компиляцию, вернитесь в ClassView.
  • Теперь Вы можете реализовать точку стыковки средствами мастера ATL Wizard.

  • Реализация точки стыковки в элементе управления ATLBandit.
  • Щелкните правой кнопкой мыши класс CATLBandit и выберите в меню Implement Connection Point.
    Откроется окно мастера создания точки соединения Implement Connection Point Wizard.


    Рис.2. Мастер Implement Connection Point Wizard

  • В Implement Connection Point Wizard установите флажок _IATLBanditEvents и щелкните ОК.
  •    
    Мастер создает класс-представитель (proxy class) - не путайте с представителем в маршалинге, - который содержит
    функции-представители (proxy functions), реализующие методы события нашего интерфейса событий. Если Вы
    обратитесь к ClassView, то увидите, что проекте появился класс CProxy_IATLBanditEvents, предоставляющий
    генерирующие события функции Fire_Click() и Fire_Jackpot(). ATL модифицирует определение
    CATLBandit так, чтобы он был производным класса CProxy_IATLBanditEvents, делая методы
    Fire_Click() и Fire_Jackpot() доступными в качестве членов класса Вашего элемента управления.

       
    Кроме того, мастер Implement Connection Point Wizard создает в классе следующую карту точек стыковки (файл ATLBandit.h):

    BEGIN_CONNECTION_POINT_MAP(CATLBandit)
    	CONNECTION_POINT_ENTRY(IID_IPropertyNotifySink)
    	CONNECTION_POINT_ENTRY(DIID__IATLBanditEvents)
    END_CONNECTION_POINT_MAP()
    

       
    Убедитесь, что карта точек стыковки выглядит именно так, как показано выше, - в некоторых случаях ATL не может
    корректно сформировать ее, что приводит к ошибкам при компиляции.

       
    Теперь Вы можете использовать функции-представители для генерации событий в Вашем элементе управления. Для демонстрации этого
    напишем тело функции-обработчика, которая генерирует событие Click при щелчке мышью в области элемента
    управления.

  • Реализация функции-обработчика OnLButtonDown().
  • В ClassView щелкните правой кнопкой мыши класс CATLBandit и в открывшемся меню
    выберите Add Windows Message Handler.
  • В списке New Windows messages/events выберите WM_LBUTTONDOWN.
    Рис.3. Добавление функции-обработчика
  • Щелкните Add and Edit, чтобы добавить функцию OnLButtonDown() и перейти в код ее тела,
    встроенного в определение класса CATLBandit. Обратите внимание, что ATL поддерживает свой
    собственный вид карты сообщений - ее код находится после исходного текста карты точек стыковки.
  • Замените строку с комментарием // TODO в теле функции ОnLButtonDown() на такую строку:
        Fire_Click();
    


    Рис.4. Добавление вызова функции Fire_Click()

   
Текст приложения можно взять здесь (33,9 Кб).

   
На следующем шаге мы рассмотрим добавление метода.



Вы можете оставить комментарий, или Трекбэк с вашего сайта.

Оставить комментарий