Элементы управления ActiveX в MFC. Добавление пользовательских событий
Пользовательские события отличаются от событий акций в том, что они не запускаются автоматически по классу COleControl
. Пользовательское событие распознает определенное действие, определенное разработчиком элемента управления, как событие. Записи карты событий для пользовательских событий представлены макросом EVENT_CUSTOM. В следующем разделе реализовано пользовательское событие для проекта элемента управления ActiveX, созданного с помощью мастера элементов управления ActiveX.
Добавление настраиваемого события с помощью мастера добавления событий
Следующая процедура добавляет определенное настраиваемое событие ClickIn. Эту процедуру можно использовать для добавления других пользовательских событий. Замените имя настраиваемого события и его параметры именем и параметрами события ClickIn.
Добавление настраиваемого события ClickIn с помощью мастера добавления событий
Загрузите проект элемента управления.
В представлении классов щелкните правой кнопкой мыши класс элемента управления ActiveX, чтобы открыть контекстное меню.
В контекстном меню выберите команду Добавить, а затем — Добавить событие.
Откроется мастер добавления событий.
В поле "Имя события" сначала выберите любое существующее событие, а затем нажмите кнопку "Настраиваемый переключатель", а затем введите ClickIn.
В поле "Внутреннее имя " введите имя функции запуска события. В этом примере используйте значение по умолчанию, предоставленное мастером добавления событий (
FireClickIn
).Добавьте параметр с именем xCoord (тип OLE_XPOS_PIXELS), используя элементы управления "Имя параметра" и "Тип параметра".
Добавьте второй параметр с именем yCoord (тип OLE_YPOS_PIXELS).
Нажмите кнопку " Готово ", чтобы создать событие.
Добавление изменений мастера событий для пользовательских событий
При добавлении настраиваемого события мастер добавления событий вносит изменения в класс управления. H. CPP и . Файлы IDL. Следующие примеры кода относятся к событию ClickIn.
Следующие строки добавляются в заголовок (. H) файл класса элемента управления:
void FireClickIn(OLE_XPOS_PIXELS xCoord, OLE_YPOS_PIXELS yCoord)
{
FireEvent(eventidClickIn, EVENT_PARAM(VTS_XPOS_PIXELS VTS_YPOS_PIXELS), xCoord, yCoord);
}
Этот код объявляет встроенную функцию FireClickIn
, которая вызывает COleControl::FireEvent с событием ClickIn и параметрами, определенными с помощью мастера добавления событий.
Кроме того, следующая строка добавляется в карту событий для элемента управления, расположенную в реализации (. CPP) файл класса элемента управления:
EVENT_CUSTOM_ID("ClickIn", eventidClickIn, FireClickIn, VTS_XPOS_PIXELS VTS_YPOS_PIXELS)
EVENT_CUSTOM_ID("ClickIn", eventidClickIn, FireClickIn, VTS_XPOS_PIXELS VTS_YPOS_PIXELS)
Этот код сопоставляет событие ClickIn с встроенной функцией FireClickIn
, передав параметры, определенные с помощью мастера добавления событий.
Наконец, в элемент управления добавляется следующая строка. IDL-файл:
[id(1)] void ClickIn(OLE_XPOS_PIXELS xCoord, OLE_YPOS_PIXELS yCoord);
Эта строка назначает событие ClickIn определенному идентификатору, полученному из позиции события в списке событий мастера добавления событий. Запись в списке событий позволяет контейнеру предвидеть событие. Например, при запуске события может быть предоставлен код обработчика.
Вызов FireClickIn
Теперь, когда вы добавили настраиваемое событие ClickIn с помощью мастера добавления событий, необходимо решить, когда это событие будет запущено. Это можно сделать, вызвав FireClickIn
при возникновении соответствующего действия. Для этого обсуждения элемент управления использует InCircle
функцию внутри WM_LBUTTONDOWN
обработчика сообщений, чтобы запустить событие ClickIn, когда пользователь щелкает внутри круговой или эллиптической области. Следующая процедура добавляет WM_LBUTTONDOWN
обработчик.
Добавление обработчика сообщений с помощью мастера добавления событий
Загрузите проект элемента управления.
В представлении классов выберите класс элемента управления ActiveX.
В окне "Свойства" отображается список сообщений, которые могут обрабатываться элементом activeX. Любое сообщение, отображаемое полужирным шрифтом, уже имеет функцию обработчика, назначенную ей.
Выберите сообщение, которое нужно обрабатывать. В этом примере выберите
WM_LBUTTONDOWN
.В раскрывающемся списке справа выберите <"Добавить> OnLButtonDown".
Дважды щелкните новую функцию обработчика в представлении классов, чтобы перейти к коду обработчика сообщений в реализации (. CPP) файл элемента управления ActiveX.
Следующий пример кода вызывает InCircle
функцию при каждом нажатии левой кнопки мыши в окне управления. Этот пример можно найти в функции обработчика WM_LBUTTONDOWN
в абстрактном примере Circ. OnLButtonDown
void CMyAxUICtrl::OnLButtonDown(UINT nFlags, CPoint point)
{
if (InCircle(point))
FireClickIn(point.x, point.y);
COleControl::OnLButtonDown(nFlags, point);
}
Примечание.
Когда мастер добавления событий создает обработчики сообщений для действий кнопки мыши, автоматически добавляется вызов того же обработчика сообщений базового класса. Не удаляйте этот вызов. Если в элементе управления используется любое из сообщений мыши, обработчики сообщений в базовом классе должны вызываться, чтобы обеспечить правильную обработку записи мыши.
В следующем примере событие запускается только в том случае, если щелчок происходит внутри круговой или эллиптической области в элементе управления. Для этого можно поместить InCircle
функцию в реализацию элемента управления (. Файл CPP:
VARIANT_BOOL CMyAxUICtrl::InCircle(CPoint& point)
{
CRect rc;
GetClientRect(rc);
// Determine radii
double a = (rc.right - rc.left) / 2;
double b = (rc.bottom - rc.top) / 2;
// Determine x, y
double x = point.x - (rc.left + rc.right) / 2;
double y = point.y - (rc.top + rc.bottom) / 2;
// Apply ellipse formula
return ((x * x) / (a * a) + (y * y) / (b * b) <= 1);
}
Вам также потребуется добавить следующее объявление InCircle
функции в заголовок элемента управления (. H) файл:
VARIANT_BOOL InCircle(CPoint& point);
Пользовательские события с именами акций
Вы можете создавать пользовательские события с тем же именем, что и события акций, однако нельзя реализовать оба элемента управления. Например, может потребоваться создать настраиваемое событие с именем Click, которое не запускается, когда событие акции Click обычно срабатывает. Затем можно запустить событие Click в любое время, вызвав ее функцию запуска.
Следующая процедура добавляет настраиваемое событие Click.
Добавление настраиваемого события, использующего имя события акции
Загрузите проект элемента управления.
В представлении классов щелкните правой кнопкой мыши класс элемента управления ActiveX, чтобы открыть контекстное меню.
В контекстном меню выберите команду Добавить, а затем — Добавить событие.
Откроется мастер добавления событий.
В раскрывающемся списке "Имя события" выберите имя события акции. В этом примере выберите "Щелкнуть".
Для типа события выберите "Пользовательский".
Нажмите кнопку " Готово ", чтобы создать событие.
Вызов
FireClick
по соответствующим местам в коде.
См. также
Элементы ActiveX библиотеки MFC
Элементы ActiveX в MFC. Методы
Класс COleControl