首页 > 学院 > 开发设计 > 正文

MFC学习(六)MFC ActiveX 控件:添加自定义事件

2019-11-08 01:14:20
字体:
来源:转载
供稿:网友

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

自定义事件与常用事件的区别在于,自定义事件不由 COleControl 类自动引发。自定义事件将控件开发人员确定的某一操作识别为事件。自定义事件的事件映射项由EVENT_CUSTOM 宏表示。下一节实现用“ActiveX 控件向导”创建的 ActiveX 控件项目的自定义事件。

使用“添加事件向导”添加自定义事件

下列过程添加特定的自定义事件 ClickIn。可以使用此过程添加其他自定义事件。用自定义事件名及其参数替换 ClickIn 事件名和参数。

使用“添加事件向导”添加 ClickIn 自定义事件

加载控件的项目。在“类视图”中,右击 ActiveX 控件类以打开快捷菜单。在快捷菜单中,单击“添加”,然后单击“添加事件”。

此操作将打开“添加事件向导”。

在“事件名称”框中,键入“ClickIn”。在“内部名称”框中,键入事件的引发函数名。在本例中,使用“添加事件向导”提供的默认值 (FireClickIn)。使用 Parameter NameParameter Type 控件,添加称为 xCoordOLE_XPOS_PIXELS 类型)的参数。添加另一个称为 yCoordOLE_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


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表