您的位置:首页 > 其它

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

2016-02-15 17:43 246 查看


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

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

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

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

使用“添加事件向导”添加 ClickIn 自定义事件
加载控件的项目。
在“类视图”中,右击 ActiveX 控件类以打开快捷菜单。
在快捷菜单中,单击“添加”,然后单击“添加事件”。
此操作将打开“添加事件向导”。

在“事件名称”框中,键入“ClickIn”。
在“内部名称”框中,键入事件的引发函数名。在本例中,使用“添加事件向导”提供的默认值 (
FireClickIn
)。
使用 Parameter NameParameter Type 控件,添加称为
xCoord
OLE_XPOS_PIXELS
类型)的参数。
添加另一个称为
yCoord
OLE_YPOS_PIXELS

类型)的参数。
单击“完成”按钮创建事件。

“添加事件向导”对自定义事件的更改

当您添加自定义事件时,“添加事件向导”会更改控件类 .H、.CPP 和 .IDL 文件。下列代码示例专用于 ClickIn 事件。

下列代码行被添加到控件类的头 (.H) 文件:

复制

void FireClickIn(OLE_XPOS_PIXELSxCoord, OLE_YPOS_PIXELSyCoord)
{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_PIXELSxCoord, OLE_YPOS_PIXELSyCoord);


这行代码根据 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
4000
) + (y * y) / (b * b) <= 1);
}


还需要将下列
InCircle
函数声明添加到控件的头 (.H) 文件:

复制

BOOL InCircle( CPoint& point );


具有常用名的自定义事件

可以创建与常用事件同名的自定义事件,但不能在同一控件中同时实现这两个事件。例如,您可能想创建一个称为 Click 的自定义事件,此事件在通常引发常用 Click 事件时不引发。然后,可以通过调用此 Click 事件的引发函数随时引发它。

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

添加使用常用事件名的自定义事件
加载控件的项目。
在“类视图”中,右击 ActiveX 控件类以打开快捷菜单。
在快捷菜单中单击“添加”,然后单击“添加事件”。
此操作将打开“添加事件向导”。

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

请参见

MFC ActiveX 控件 |
MFC ActiveX 控件:方法 |
COleControl
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: