MFC ActiveX 控件:添加自定义事件
自定义事件与常用事件的区别在于,自定义事件不由 COleControl 类自动引发。自定义事件将控件开发人员确定的某一操作识别为事件。自定义事件的事件映射项由EVENT_CUSTOM 宏表示。下一节实现用“ActiveX 控件向导”创建的 ActiveX 控件项目的自定义事件。
使用“添加事件向导”添加自定义事件
下列过程添加特定的自定义事件 ClickIn。可以使用此过程添加其他自定义事件。用自定义事件名及其参数替换 ClickIn 事件名和参数。
使用“添加事件向导”添加 ClickIn 自定义事件
- 加载控件的项目。
- 在“类视图”中,右击 ActiveX 控件类以打开快捷菜单。
- 在快捷菜单中,单击“添加”,然后单击“添加事件”。
此操作将打开“添加事件向导”。
- 在“事件名称”框中,键入“ClickIn”。
- 在“内部名称”框中,键入事件的引发函数名。在本例中,使用“添加事件向导”提供的默认值 (
FireClickIn
)。 - 使用 Parameter Name 和 Parameter Type 控件,添加称为
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
的内联函数,该函数用 ClickIn 事件和使用“添加事件向导”定义的参数调用COleControl::FireEvent。
另外,下列代码行被添加到控件的事件映射,此事件映射位于控件类的实现 (.CPP) 文件中:
EVENT_CUSTOM("ClickIn", 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
您已经使用“添加事件向导”添加了自定义事件,现在必须决定引发该事件的时间。通过在发生适当的操作时调用 FireClickIn
来完成此决定。在此讨论中,当用户在圆形或椭圆形区域内单击时,控件使用WM_LBUTTONDOWN 消息处理程序中的 InCircle
函数引发 ClickIn 事件。下列过程添加WM_LBUTTONDOW 处理程序。
使用“添加事件向导”添加消息处理程序
- 加载控件的项目。
- 在“类视图”中,选择 ActiveX 控件类。
- 在“属性”窗口中,单击“消息”按钮。
“属性”窗口显示可由 ActiveX 控件处理的消息列表。任何以粗体显示的消息都有一个分配的处理函数。
- 在“属性”窗口中,选择要处理的消息。在本例中,选择“WM_LBUTTONDOWN”。
- 从右边的下拉列表框中,选择“<添加> OnLButtonDown”。
- 在“类视图”中双击新的处理函数,跳转到 ActiveX 控件的实现 (.CPP) 文件中的消息处理程序代码。
下面的代码示例在每次在控件窗口中单击鼠标左键时调用 InCircle 函数。该示例可在 Circ 示例摘要中的 WM_LBUTTONDOWN 处理函数 OnLButtonDown 中找到。
void CSampleCtrl::OnLButtonDown(UINT nFlags, CPoint point) { if (InCircle(point)) FireClickIn(point.x, point.y); COleControl::OnLButtonDown(nFlags, point); }
注意 当“添加事件向导”创建鼠标按钮操作的消息处理程序时,将自动添加对基类的相同消息处理程序的调用。不要移除此调用。如果控件使用任何常用鼠标消息,则必须调用基类中的消息处理程序,以确保正确地处理鼠标捕获。
在下例中,仅当在控件中的圆形或椭圆形区域内发生单击操作时才引发事件。若要实现此行为,可以将 InCircle
函数放置在控件的实现 (.CPP) 文件中:
BOOL CSampleCtrl::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) 文件:
BOOL InCircle( CPoint& point );
具有常用名的自定义事件
可以创建与常用事件同名的自定义事件,但不能在同一控件中同时实现这两个事件。例如,您可能想创建一个称为 Click 的自定义事件,此事件在通常引发常用 Click 事件时不引发。然后,可以通过调用此 Click 事件的引发函数随时引发它。
下列过程添加自定义 Click 事件。
添加使用常用事件名的自定义事件
- 加载控件的项目。
- 在“类视图”中,右击 ActiveX 控件类以打开快捷菜单。
- 在快捷菜单中单击“添加”,然后单击“添加事件”。
此操作将打开“添加事件向导”。
- 在“事件名称”下拉列表中选择一个常用事件名。在本例中,选择“Click”。
- 在“事件类型”中,选择“自定义”。
- 单击“完成”按钮创建事件。
- 在代码中的适当位置调用
FireClick
。
请参见
MFC ActiveX 控件 |MFC ActiveX 控件:方法 |COleControl