自定义事件不同于常用事件不同它们不会被 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);
}
此代码声明使用"添加事件向导,使用的调用 ClickIn 事件和参数的 COleControl::FireEvent 您定义的内联函数调用 FireClickIn。
此外,下列代码行添加到控件的事件映射,位于控件类的实现 (.cpp) 文件:
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 完成此操作,在适当时发生。 对于本讨论中,当用户在此单击一个圆形或椭圆区域内部时,控件将在 WM_LBUTTONDOWN 消息处理程序内的 InCircle 函数 ClickIn 激发事件。 以下过程向 WM_LBUTTONDOWN 处理程序。
将添加事件向导"的消息处理程序
加载控件的项目。
在"类视图,选择 ActiveX 控件类。
在“属性”窗口中,单击“消息”按钮。
属性窗口显示可由 ActiveX 控件处理消息的列表。 在粗体的所有消息添加已经有处理程序函数分配给它。
在属性窗口中,选择您希望处理的消息。 对于此示例,选择 WM_LBUTTONDOWN。
从右边的下拉列表框中,选择 <Add OnLButtonDown> 。
双击新处理程序函数在"类视图"跳转到在 ActiveX 控件的实现 (.cpp) 文件的消息处理程序代码。
在鼠标左键在控件窗口内单击时,以下代码示例调用 InCircle 函数。 此示例可以在 WM_LBUTTONDOWN 处理函数,OnLButtonDown查找,在 Circ 示例 抽象。
void CMyAxUICtrl::OnLButtonDown(UINT nFlags, CPoint point)
{
if (InCircle(point))
FireClickIn(point.x, point.y);
COleControl::OnLButtonDown(nFlags, point);
}
备注
当添加事件向导"创建操作鼠标按钮时的消息处理程序,对基类相同的消息处理程序的调用自动添加。请勿删除此调用。如果控件使用任何常用鼠标消息,基类的调用捕获鼠标消息处理程序必须确保正确处理。
在下面的示例中,事件激发时,才单击出现在控件内的循环或省略区域内。 要实现此行为,可以在控件的实现 (.cpp) 文件中的 InCircle 函数:
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);
与产品名称的自定义事件
您可以创建一个名为的自定义事件和库存事件相同,但是,您无法实现都在同一控件。 例如,您可能想创建不调用触发单击的自定义事件、事件何时单击通常都将激发。 您可以通过调用其触发函数然后触发随时单击事件。
下面过程添加自定义。单击事件
添加使用常用事件名称的自定义事件
加载控件的项目。
在"类视图"中,右击该 ActiveX 控件类打开快捷菜单。
从快捷菜单中单击 添加,然后单击 添加事件。
这将打开"添加事件向导"
在 事件名称 下拉列表中,选择一个常用事件名称。 对于此示例,选择 单击。
对于 事件类型,选择 自定义。
单击以创建事件的 完成。
在代码中适当位置调用 FireClick。