自定义事件不同于库存事件,因为它们不是由类 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 ,其中包含使用 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
处理程序。
使用“添加事件向导”添加消息处理程序
加载控件的项目。
在 类视图中,选择 ActiveX 控件类。
在 “属性” 窗口中,可以看到 ActiveX 控件可以处理的消息列表。 粗体中显示的任何消息都已为其分配了处理程序函数。
选择要处理的消息。 对于此示例,请选择
WM_LBUTTONDOWN
。从右侧的下拉列表框中,选择“<添加> OnLButtonDown”。
双击 类视图中 的新处理程序函数以跳转到实现中的消息处理程序代码(。ActiveX 控件的 CPP) 文件。
下面的代码示例每次在控件窗口中单击鼠标左键时都会调用 InCircle
该函数。 可以在处理程序函数OnLButtonDown
(WM_LBUTTONDOWN
Circ 示例抽象)中找到此示例。
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 事件。
添加使用股票事件名称的自定义事件
加载控件的项目。
在 类视图中,右键单击 ActiveX 控件类以打开快捷菜单。
在快捷菜单中,单击“ 添加 ”,然后单击“ 添加事件”。
这将打开“添加事件向导”。
在 “事件名称” 下拉列表中,选择股票事件名称。 对于此示例,请选择 “单击”。
对于 事件类型,请选择“ 自定义”。
单击“ 完成 ”以创建事件。
在代码中的适当位置调用
FireClick
。