MFC ActiveX 控件:添加自定义事件

自定义事件不同于库存事件,因为它们不是由类 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);
}

此代码声明一个内联函数,该函数调用 FireClickInCOleControl::FireEvent ,其中包含使用 Add 事件向导定义的 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 事件分配一个特定的 ID 号,该编号取自“添加事件向导”事件列表中的事件位置。 事件列表中的条目允许容器预测事件。 例如,它可能提供在触发事件时要执行的处理程序代码。

调用 FireClickIn

现在,你已使用“添加事件向导”添加了 ClickIn 自定义事件,必须决定何时触发此事件。 执行此作的方式是,在发生相应的作时调用 FireClickIn 。 对于此讨论,当用户在圆形或椭圆区域内单击时,该控件使用 InCircle 消息处理程序内的 WM_LBUTTONDOWN 函数触发 ClickIn 事件。 以下过程将添加 WM_LBUTTONDOWN 处理程序。

使用“添加事件向导”添加消息处理程序

  1. 加载控件的项目。

  2. 类视图中,选择 ActiveX 控件类。

  3. “属性” 窗口中,可以看到 ActiveX 控件可以处理的消息列表。 粗体中显示的任何消息都已为其分配了处理程序函数。

  4. 选择要处理的消息。 对于此示例,请选择 WM_LBUTTONDOWN

  5. 从右侧的下拉列表框中,选择“<添加> OnLButtonDown”。

  6. 双击 类视图中 的新处理程序函数以跳转到实现中的消息处理程序代码(。ActiveX 控件的 CPP) 文件。

下面的代码示例每次在控件窗口中单击鼠标左键时都会调用 InCircle 该函数。 可以在处理程序函数OnLButtonDownWM_LBUTTONDOWNCirc 示例抽象)中找到此示例。

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 事件。

以下过程添加自定义 Click 事件。

添加使用股票事件名称的自定义事件

  1. 加载控件的项目。

  2. 类视图中,右键单击 ActiveX 控件类以打开快捷菜单。

  3. 在快捷菜单中,单击“ 添加 ”,然后单击“ 添加事件”。

    这将打开“添加事件向导”。

  4. “事件名称” 下拉列表中,选择股票事件名称。 对于此示例,请选择 “单击”。

  5. 对于 事件类型,请选择“ 自定义”。

  6. 单击“ 完成 ”以创建事件。

  7. 在代码中的适当位置调用 FireClick

另请参阅

MFC ActiveX 控件
MFC ActiveX 控件:方法
COleControl 类