Поделиться через


Элементы управления ActiveX в MFC. Добавление пользовательских событий

Пользовательские события отличаются от событий акций в том, что они не запускаются автоматически по классу COleControl. Пользовательское событие распознает определенное действие, определенное разработчиком элемента управления, как событие. Записи карты событий для пользовательских событий представлены макросом EVENT_CUSTOM. В следующем разделе реализовано пользовательское событие для проекта элемента управления ActiveX, созданного с помощью мастера элементов управления ActiveX.

Добавление настраиваемого события с помощью мастера добавления событий

Следующая процедура добавляет определенное настраиваемое событие ClickIn. Эту процедуру можно использовать для добавления других пользовательских событий. Замените имя настраиваемого события и его параметры именем и параметрами события ClickIn.

Добавление настраиваемого события ClickIn с помощью мастера добавления событий

  1. Загрузите проект элемента управления.

  2. В представлении классов щелкните правой кнопкой мыши класс элемента управления ActiveX, чтобы открыть контекстное меню.

  3. В контекстном меню выберите команду Добавить, а затем — Добавить событие.

    Откроется мастер добавления событий.

  4. В поле "Имя события" сначала выберите любое существующее событие, а затем нажмите кнопку "Настраиваемый переключатель", а затем введите ClickIn.

  5. В поле "Внутреннее имя " введите имя функции запуска события. В этом примере используйте значение по умолчанию, предоставленное мастером добавления событий (FireClickIn).

  6. Добавьте параметр с именем xCoord (тип OLE_XPOS_PIXELS), используя элементы управления "Имя параметра" и "Тип параметра".

  7. Добавьте второй параметр с именем yCoord (тип OLE_YPOS_PIXELS).

  8. Нажмите кнопку " Готово ", чтобы создать событие.

Добавление изменений мастера событий для пользовательских событий

При добавлении настраиваемого события мастер добавления событий вносит изменения в класс управления. 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 обработчик.

Добавление обработчика сообщений с помощью мастера добавления событий

  1. Загрузите проект элемента управления.

  2. В представлении классов выберите класс элемента управления ActiveX.

  3. В окне "Свойства" отображается список сообщений, которые могут обрабатываться элементом activeX. Любое сообщение, отображаемое полужирным шрифтом, уже имеет функцию обработчика, назначенную ей.

  4. Выберите сообщение, которое нужно обрабатывать. В этом примере выберите WM_LBUTTONDOWN.

  5. В раскрывающемся списке справа выберите <"Добавить> OnLButtonDown".

  6. Дважды щелкните новую функцию обработчика в представлении классов, чтобы перейти к коду обработчика сообщений в реализации (. 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.

Добавление настраиваемого события, использующего имя события акции

  1. Загрузите проект элемента управления.

  2. В представлении классов щелкните правой кнопкой мыши класс элемента управления ActiveX, чтобы открыть контекстное меню.

  3. В контекстном меню выберите команду Добавить, а затем — Добавить событие.

    Откроется мастер добавления событий.

  4. В раскрывающемся списке "Имя события" выберите имя события акции. В этом примере выберите "Щелкнуть".

  5. Для типа события выберите "Пользовательский".

  6. Нажмите кнопку " Готово ", чтобы создать событие.

  7. Вызов FireClick по соответствующим местам в коде.

См. также

Элементы ActiveX библиотеки MFC
Элементы ActiveX в MFC. Методы
Класс COleControl