Добавление события (учебник ATL, часть 5)
На этом шаге добавляется ClickIn и событие ClickOut к вашему элементу управления библиотеки ATL. Вы char событие ClickIn если пользователь щелкает внутри многоугольник и в ClickOut, если пользователь щелкает мышью за пределами. Задачи добавить событие следующим образом:
Добавление методов ClickIn и ClickOut
Создание библиотеки типов
Реализация интерфейсов точки подключения
Добавление методов ClickIn и ClickOut
При создании управление библиотеки ATL на шаге 2 установлен флажок Точки подключения. Это необходимо для создания интерфейс _IPolyCtlEvents в файле Polygon.idl. Обратите внимание, что в начале имени интерфейса с символа подчеркивания. Это соглашение для указания того, что интерфейс внутренний интерфейс. Таким образом, программы, позволяющие просматривать COM-объект может выбрать отображение интерфейса пользователя. Также обратите внимание, что при выборе Точки подключения добавить следующую линию в файле Polygon.idl, чтобы указать, что _IPolyCtlEvents по умолчанию интерфейс источника:
[default, source] dispinterface _IPolyCtlEvents;
Исходный атрибут указывает на то, что элемент управления источника уведомлений, чтобы вызывать этот интерфейс в контейнере.
Теперь добавьте ClickIn и методы ClickOut к _IPolyCtlEvents взаимодействие.
Добавление методов ClickIn и ClickOut
В представлении классов разверните многоугольник и PolygonLib для отображения _IPolyCtlEvents.
Щелкните правой кнопкой мыши _IPolyCtlEvents. В контекстном меню выберите команду Добавить, а затем выберите команду Добавить метод.
Выберите Возвращаемый типvoid.
Введите ClickIn в окно Имя метода.
В Атрибуты параметра, выберите окно В.
Выберите Тип параметраLONG.
Введите x как Имя параметра и нажмите кнопку Добавить.
Повторяющиеся секции 5 до 7, это время для Имя параметраY.
Нажмите кнопку Далее.
Введите метод ClickIn как helpstring.
Нажмите кнопку Готово.
Повторяющееся выше шаги для указания метода ClickOut с теми же параметрами x и y, таким же Атрибуты параметраLONG и тем же типом возврата void.
Проверьте файл Polygon.idl, чтобы увидеть, что код был добавлен в диспетчерский интерфейс _IPolyCtlEvents.
Dispinterface _IPolyCtlEvents в файле Polygon.idl теперь должен выглядеть следующим образом:
dispinterface _IPolyCtlEvents
{
properties:
methods:
[id(1), helpstring("method ClickIn")] void ClickIn([in] LONG x, [in] LONG y);
[id(2), helpstring("method ClickOut")] void ClickOut([in] LONG x, [in] LONG y);
};
Методы ClickIn и ClickOut принимают координаты x и y выбранной точки в качестве параметров.
Создание библиотеки типов
Создайте библиотеку типов на этом этапе, поскольку мастер точки подключения будет его использовать для получения сведений для этого необходимо создать интерфейс точки подключения и интерфейс контейнера точки подключения для элемента управления.
Создать библиотеку типов
Перестройте проект.
-или-
Щелкните правой кнопкой мыши файл Polygon.idl в обозревателе решений и выберите в контекстном меню Компилировать.
Это создает файл Polygon.tlb, библиотека типов. Файл Polygon.tlb не отображается в обозревателе решений, так как двоичный файл и не может быть доступна или изменятьо напрямую.
Реализация интерфейсов точки подключения
Реализуйте интерфейс точки подключения и интерфейс контейнера точки подключения для элемента управления. В модели COM, события передаются через механизм точек подключения. Для получения событий из com-объекта, контейнер устанавливает вспомогательное соединение в точке подключения этой средства COM-объект. Поскольку COM-объект может иметь несколько точек соединения com-объекта, также реализует интерфейс контейнера точки подключения. Через этот интерфейс, контейнер может определить, какие точки соединения поддерживаются.
Интерфейс, который реализуется точка подключения вызвать IConnectionPoint и интерфейсом, который реализует контейнер точки подключения вызвать IConnectionPointContainer.
Чтобы обеспечить реализацию IConnectionPoint, будет использоваться мастер реализовать точки подключения. Этот мастер создает интерфейс IConnectionPoint, считывая библиотеку типов и реализация функции для каждого события, можно создать.
Воспользоваться мастером реализация точки подключения
В представлении классов щелкните правой кнопкой мыши класс реализации CPolyCtl элемента управления.
В контекстном меню выберите Добавить, а затем нажмите кнопку Добавить точку подключения.
Выберите из списка Исходные интерфейсы_IPolyCtlEvents и дважды щелкните его, чтобы добавить его в столбец Реализовать точки соединения. Нажмите кнопку Готово. Класс-посредник для точки подключения будет создан в этом случае CProxy_IPolyCtlEvents.
При рассмотрении созданный файл _IPolyCtlEvents_CP.h в обозревателе решений, можно увидеть, что имеется класс с именем CProxy_IPolyCtlEvents, производный от IConnectionPointImpl. _IPolyCtlEvents_CP.h также определяет метод Fire_ClickIn 2 и Fire_ClickOut, который принимает 2 параметров координат. Эти методы вызываются, когда требуется создать событие из элемента управления.
Мастер также CProxy_PolyEvents и добавленное в список IConnectionPointContainerImpl множественного наследования элемента управления. Мастер также предоставлял IConnectionPointContainer, добавив соответствующие записи в сопоставление модели COM.
Закончите реализация кода для поддержки событий. Теперь добавьте некоторый код, чтобы создать события в соответствующий момент. Помните, идите создать событие ClickIn или ClickOut, когда пользователь щелкает нажатие левой кнопки мыши в элементе управления. Чтобы узнать, когда пользователь нажимает кнопку, добавьте обработчик для сообщения WM_LBUTTONDOWN.
Добавление обработчика для сообщения WM_LBUTTONDOWN
В представлении классов щелкните правой кнопкой мыши класс CPolyCtl и нажмите кнопку Свойства в контекстном меню.
В окне Свойства, щелкните значок Сообщения а затем нажмите кнопку WM_LBUTTONDOWN из списка, слева.
Из раскрывающегося списка, который отобразится нажмите кнопку <Добавить> OnLButtonDown. Объявление обработчика OnLButtonDown будет добавлено к PolyCtl.h и реализация обработчика будет добавлена к PolyCtl.cpp.
Далее измените обработчик.
Изменить метод OnLButtonDown
Измените код, который состоит из метода OnLButtonDown в PolyCtl.cpp (при удалении любой код, помещенный мастером) таким образом, чтобы он будет выглядеть следующим образом:
LRESULT CPolyCtl::OnLButtonDown(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& /*bHandled*/) { HRGN hRgn; WORD xPos = LOWORD(lParam); // horizontal position of cursor WORD yPos = HIWORD(lParam); // vertical position of cursor CalcPoints(m_rcPos); // Create a region from our list of points hRgn = CreatePolygonRgn(&m_arrPoint[0], m_nSides, WINDING); // If the clicked point is in our polygon then fire the ClickIn // event otherwise we fire the ClickOut event if (PtInRegion(hRgn, xPos, yPos)) Fire_ClickIn(xPos, yPos); else Fire_ClickOut(xPos, yPos); // Delete the region that we created DeleteObject(hRgn); return 0; }
Этот код использует точки, вычисляемые в функции OnDraw создал область, которая обнаруживает щелчка мыши пользователя с вызовом PtInRegion.
Параметр uMsg идентификатор, обращанным сообщения Windows. Это позволяет иметь одну функцию, обрабатывающую диапазон сообщений. wParam и параметры lParam стандартные значения для обращанными сообщения. BHandled параметр позволяет определить, является ли функция или не обрабатывало сообщение. По умолчанию значение установлено в TRUE для указания того, что функция обрабатывало сообщение, но можно установить ее в FALSE. Это приведет к другой библиотеки ATL продолжить поиск обработчика сообщений функцию, которому отправляется сообщение.
Построение и тестирование элемента управления
Теперь попытка вне свои события. Создайте элемент управления и запустите тестовый контейнер элементов управления ActiveX еще раз. На этот раз обзор окно журнал событий. Для направления события в окно вывода, щелкните Ведение журнала из меню Параметры и выберите Журнал, чтобы вывести окно. Вставьте элемент управления и повторите щелкните в окне. Обратите внимание, что ClickIn инициировано если щелкнуть область заполненный многоугольник, и ClickOut инициировано, если щелкнуть вне его.
Далее добавим страница свойств.
Возвращается к шагу 4 | В шаге 6 на