MFC ActiveX 控件:添加自定义操作

自定义操作与常用事件不同它们不包括类 COleControl自动触发。自定义操作识别某些事件,依赖于控件的开发人员,作为事件。自定义操作的事件映射项。 EVENT_CUSTOM 宏表示。以下各节实现使用 Activex 控件向导,创建的 Activex 控件项目的自定义操作。

添加了添加事件向导 " 的自定义操作

下面的过程添加特定的自定义事件, ClickIn。可以使用此过程将其他自定义操作。在 ClickIn 事件名称和参数并将您的自定义事件名称及其参数。

使用添加事件向导,添加 ClickIn 自定义操作

  1. 加载您的控件的项目中。

  2. 在 " 类视图 " 中,右击您的 Activex 控件类打开快捷菜单。

  3. 从快捷菜单上,单击 添加 然后单击 添加事件

    这将打开事件添加向导。

  4. Event name 框中,首先选择所有现有事件,然后单击该 自定义 单选按钮,然后类型 ClickIn。

  5. Internal name 框中,键入事件激发的函数的名称。对于此示例,请使用添加事件向导提供的默认 (FireClickIn)。

  6. 将一个参数,调用 xCoord (类型 OLE_XPOS_PIXELS),使用 参数名称Parameter Type 控件。

  7. 添加第二个参数,调用 yCoord (类型 OLE_YPOS_PIXELS)。

  8. 单击创建事件的 完成

添加事件自定义操作的向导更改

当您添加自定义操作时,将向事件向导对控件类的更改。、、 .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 处理程序。

添加将事件向导的消息处理程序

  1. 加载您的控件的项目中。

  2. 在类视图中,选择您的 Activex 控件类。

  3. 在“属性”窗口中,单击“消息”按钮。

    " 属性 " 窗口中显示可由 Activex 控件处理消息的列表。以粗体显示的所有消息已具有一个处理程序函数分配给它。

  4. 从 " 属性 " 窗口中,选择要处理的消息。对于此示例,选择 WM_LBUTTONDOWN

  5. 从右边的下拉列表框中,选择 添加 OnLButtonDown

  6. 双击类视图的新处理程序函数跳转到您的 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);

与股票名称的自定义操作

您可以创建自定义操作和库存操作相同,但是,您无法实现都在同一控件。例如,您可能希望创建调用将引发单击的自定义操作库存单击事件时通常将引发。还可以通过调用其激发功能随时然后触发单击事件。

下面的过程添加自定义单击事件。

添加使用一个常用事件名称的自定义操作

  1. 加载您的控件的项目中。

  2. 在 " 类视图 " 中,右击您的 Activex 控件类打开快捷菜单。

  3. 从快捷菜单上,单击 添加 然后单击 添加事件

    这将打开事件添加向导。

  4. 在的 事件名 下拉列表中,选择一个常用事件名称。对于此示例,选择 单击

  5. 对于 事件类型,选择 自定义

  6. 单击创建事件的 完成

  7. 在代码中的适当位置调用 FireClick 。

请参见

参考

COleControl 类

概念

MFC ActiveX 控件

MFC ActiveX 控件:方法