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

来源:互联网 发布:淘宝打开商品w异常 编辑:程序博客网 时间:2024/04/28 17:13


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

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

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

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

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

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

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

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

此代码声明了一个称为 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 处理程序。

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

  1. 加载控件的项目。
  2. 在“类视图”中,选择 ActiveX 控件类。
  3. 在“属性”窗口中,单击“消息”按钮。

    “属性”窗口显示可由 ActiveX 控件处理的消息列表。任何以粗体显示的消息都有一个分配的处理函数。

  4. 在“属性”窗口中,选择要处理的消息。在本例中,选择“WM_LBUTTONDOWN”。
  5. 从右边的下拉列表框中,选择“<添加> OnLButtonDown”。
  6. 在“类视图”中双击新的处理函数,跳转到 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 事件。

添加使用常用事件名的自定义事件

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

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

  4. 在“事件名称”下拉列表中选择一个常用事件名。在本例中,选择“Click”。
  5. 在“事件类型”中,选择“自定义”。
  6. 单击“完成”按钮创建事件。
  7. 在代码中的适当位置调用 FireClick

请参见

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

0 0
原创粉丝点击