美文网首页IT.技术分享IT技术篇
vs2017开发ActiveX(主讲OCX)(六)、添加自定义事

vs2017开发ActiveX(主讲OCX)(六)、添加自定义事

作者: 5de9e117f2fe | 来源:发表于2019-06-19 10:30 被阅读0次

    添加自定义事件

    前言

    自定义事件与常用事件的不同之处在于它们不会被类COleControl自动触发。 自定义事件将由控件开发人员确定的特定操作识别为事件。 自定义事件的事件映射条目由EVENT_CUSTOM宏表示。 以下部分实现了使用ActiveX控件向导创建的ActiveX控件项目的自定义事件。

    通过添加事件向导添加的自定义事件

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

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

    • 加载你的控件工程。

    • 在“类视图”中,右键单击ActiveX控件类以打开快捷菜单。

    • 从快捷菜单中,单击“添加”,然后单击“添加事件”。


      添加事件
    • 这将打开“添加事件向导”。


      打开向导
    • 在“事件名称”框中,首先选择任何现有事件,然后单击“自定义”单选按钮,然后键入ClickIn。


      添加ClickIn
    • 在“内部名称”框中,键入事件的触发功能的名称。对于此示例,请使用“添加事件向导”(FireClickIn)提供的默认值。


      添加FireClickIn
    • 使用“参数名称”和“参数类型”控件添加一个名为xCoord的参数(类型为OLE_XPOS_PIXELS)。


      添加xCoord
    • 添加第二个参数,称为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);
        }
    
    .h文件

    此代码声明了一个名为FireClickIn的内联函数,通过使用“添加事件向导”定义的ClickIn事件和参数调用COleControl :: FireEvent。

    此外,以下行添加到控件的事件映射中,位于控件类的实现(.CPP)文件中:

    EVENT_CUSTOM_ID("ClickIn", eventidClickIn, FireClickIn, VTS_XPOS_PIXELS VTS_YPOS_PIXELS)
    
    .cpp

    此代码将事件ClickIn映射到内联函数FireClickIn,并使用“添加事件向导”传递您定义的参数。

    最后,以下行添加到控件的.IDL文件中:

    [id(1)] void ClickIn(OLE_XPOS_PIXELS xCoord, OLE_YPOS_PIXELS yCoord);
    
    .idl

    此行为ClickIn事件分配一个特定的ID号,该ID号取自事件在“添加事件向导”事件列表中的位置。事件列表中的条目允许容器预测事件。例如,它可能提供在触发事件时要执行的处理程序代码。

    调用FireClickIn

    现在您已使用“添加事件向导”添加了ClickIn自定义事件,您必须决定何时触发此事件。您可以通过在发生相应操作时调用FireClickIn来执行此操作。对于此讨论,当用户在圆形或椭圆形区域内单击时,控件使用WM_LBUTTONDOWN消息处理程序内的InCircle函数来触发ClickIn事件。以下过程添加WM_LBUTTONDOWN处理程序。

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

    • 加载您的控件的项目。

    • 在“类视图”中,选择ActiveX控件类。

    • 在“属性”窗口中,单击“消息”按钮。
      “属性”窗口显示可由ActiveX控件处理的消息列表。以粗体显示的任何消息都已分配了一个处理函数。


      属性
      消息
    • 从“属性”窗口中,选择要处理的消息。对于此示例,请选择WM_LBUTTONDOWN。

    • 从右侧的下拉列表框中,选择<Add> OnLButtonDown。

    • 选择
    • 双击“类视图”中的新处理程序函数,跳转到ActiveX控件的实现(.CPP)文件中的消息处理程序代码。


      双击消息

      每次在控制窗口中单击鼠标左键时,以下代码示例都会调用InCircle函数。此示例可以在Circ示例摘要中的WM_LBUTTONDOWN处理函数OnLButtonDown中找到。

    void CCreateOcxDemoCtrl::OnLButtonDown(UINT nFlags, CPoint point)
    {
        // TODO: 在此添加消息处理程序代码和/或调用默认值
        if (InCircle(point))
            FireClickIn(point.x, point.y);
    
        COleControl::OnLButtonDown(nFlags, point);
    }
    

    注意 当“添加事件向导”为鼠标按钮操作创建消息处理程序时,将自动添加对基类的同一消息处理程序的调用。 请勿删除此电话。 如果您的控件使用任何常用鼠标消息,则必须调用基类中的消息处理程序以确保正确处理鼠标捕获。

    在以下示例中,仅当单击发生在控件内的圆形或椭圆形区域内时,才会触发事件。 要实现此行为,可以将InCircle函数放在控件的实现(.CPP)文件中:

    VARIANT_BOOL CCreateOcxDemoCtrl::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);
    

    具有常用名称的自定义事件

    您可以创建与常用事件同名的自定义事件,但是您无法在同一控件中实现这两个事件。 例如,您可能希望创建一个名为Click的自定义事件,当通常触发常用事件Click时,该事件不会触发。 然后,您可以通过调用其触发功能随时触发Click事件。

    以下过程添加自定义Click事件。

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

    • 加载您的控件的项目。

    • 在“类视图”中,右键单击ActiveX控件类以打开快捷菜单。

    • 从快捷菜单中,单击“添加”,然后单击“添加事件”。
      这将打开“添加事件向导”。

    • 在“事件名称”下拉列表中,选择常用事件名称。 对于此示例,请选择“单击”。

    • 对于事件类型,选择自定义。

    • 单击“完成”以创建事件。

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

    备注:添加事件的自定义事件的方法不止上面这种也可通过其他方式添加,这里不多说。

    相关文章

      网友评论

        本文标题:vs2017开发ActiveX(主讲OCX)(六)、添加自定义事

        本文链接:https://www.haomeiwen.com/subject/lldhqctx.html