vs2017开发ActiveX(主讲OCX)(五)、事件
ActiveX控件使用事件来通知容器控件发生了什么。事件的常见示例包括控件的点击,使用键盘输入的数据以及控件状态的更改。发生这些操作时,控件将触发事件以警告容器。
事件也称为消息。
ActiveX 控件使用事件来通知发生到控件的容器。 事件的常见示例包括单击在控件上,输入在控件的状态中使用键盘和更改的数据。 这些操作发生时,该控件触发事件以提醒容器。
事件也称为消息。
MFC 支持两种类型的事件: 常用和自定义。 常用事件是事件的类COleControl会自动处理。 常用事件的完整列表,请参阅文章MFC ActiveX 控件:添加常用事件。 自定义事件使控件能够在特定于该控件的操作发生时通知该容器。 一些示例是一个控件的内部状态或在某些窗口消息接收更改。
为您正确地引发事件的控制,你的控件类必须映射到相关的事件发生时,应调用的成员函数的控件的每个事件。 此映射机制 (称为事件映射) 集中了有关事件的信息,并允许 Visual Studio 轻松访问和操作该控件的事件。 下面的宏,位于标头中声明此事件映射 (.H) 文件的控件类声明:
DECLARE_EVENT_MAP()
声明事件映射后,它必须在定义控件的实现 (.CPP) 文件。 以下代码行定义事件映射,从而允许您控制触发特定事件:
BEGIN_EVENT_MAP(CCreateOcxDemoCtrl, COleControl)
END_EVENT_MAP()
如果您使用 MFC ActiveX 控件向导创建项目,它会自动添加这些行。 如果不使用 MFC ActiveX 控件向导,则必须手动添加这些行。
类视图,则你可以添加类支持的常用事件COleControl或你定义的自定义事件。 对于每个新的事件,类视图会自动将相应的条目添加到控件的事件映射和控件的。IDL 文件。
下面讨论了事件的详细信息:
MFC ActiveX 控件:添加常用事件<span id="jump"> </span>
常用事件不同于自定义事件,它们会自动触发由类COleControl。 COleControl 包含引发事件导致的常见操作的预定义的成员函数。 由实现的一些常见操作COleControl包括单-和当时的 clicks 控件、 键盘事件和更改鼠标按钮的状态。 条件映射常用事件始终使用 EVENT_STOCK 前缀开头。
常用事件支持通过向导添加
COleControl类提供了下表中列出的十个常用事件。你可以通过事件添加向导在你的控件中添加你想使用的事件。
常用事件
事件名称 | 触发函数 | 注释 |
---|---|---|
Click | void FireClick( ) | 触发时控制捕获鼠标,任何BUTTONUP接收 (左侧、 中间或右侧) 消息,并在控件上释放该按钮。 此事件之前发生的常用鼠标按下和 MouseUp 事件。事件映射条目:EVENT_STOCK_CLICK( ) |
DblClick | void FireDblClick( ) | 当接收到BUTTONDBLCLK消息,类似于单击事件。事件映射条目:EVENT_STOCK_DBLCLICK( ) |
Error | void FireError( SCODE scode , LPCSTR lpszDescription , UINT nHelpID = 0 ) | 当将范围之外的方法调用或属性访问 ActiveX 控件中发生错误时引发。事件映射条目: EVENT_STOCK_ERROREVENT( ) |
KeyDown | void FireKeyDown( short nChar , short nShiftState ) | 当收到WM_SYSKEYDOWN或WM_KEYDOWN消息时触发。事件映射条目:EVENT_STOCK_KEYDOWN( ) |
KeyPress | void FireKeyPress( short * pnChar ) | 当接收到WM_CHAR消息时触发。事件映射条目:EVENT_STOCK_KEYPRESS( ) |
KeyUp | void FireKeyUp( short nChar , short nShiftState ) | 当接收到WM_SYSKEYUP或WM_KEYUP消息触发。事件映射条目:EVENT_STOCK_KEYUP( ) |
MouseDown | void FireMouseDown( short nButton , short nShiftState , float x , float y ) | 接收到任何BUTTONDOWN (左侧、 中间或右侧)消息。 鼠标将在事件触发前捕获此事件。事件映射条目:EVENT_STOCK_MOUSEDOWN( ) |
MouseMove | void FireMouseMove( short nButton , short nShiftState , float x , float y ) | 当收到 WM_MOUSEMOVE 消息时触发。事件映射条目:EVENT_STOCK_MOUSEMOVE( ) |
MouseUp | void FireMouseUp( short nButton , short nShiftState , float x , float y ) | 收到任何BUTTONUP (左侧、 中间或右侧)消息时。 鼠标将在触发前捕获此事件。事件映射条目:EVENT_STOCK_MOUSEUP( ) |
ReadyStateChange | void FireReadyStateChange( ) | 基于在收到一定数量数据后转换为下一个就绪状态时触发。事件映射条目:EVENT_STOCK_READYSTATECHANGE( ) |
使用添加事件向导添加常用事件
添加常用事件比添加自定义事件需要更少的工作,因为实际事件的触发由基类COleControl自动处理。 以下过程使用开发的控件添加常用事件MFC ActiveX 控件向导。 调用 KeyPress 事件时触发,按下某个键并在控件处于活动状态。 此过程还用于添加其他常用事件。 替换 KeyPress 的所选的常用事件名称。
使用添加事件向导添加KeyPress常用事件
- 加载控件的项目。
- 在类视图中,右键单击你的 ActiveX 控件类以打开快捷菜单。
- 从快捷菜单中,单击添加,然后单击添加事件。
-
这将打开添加事件向导。
五 -
在事件名称下拉列表中,选择KeyPress。
选择KeyPress - 单击 “完成”。
在添加事件向导中更改常用事件
因为常用事件处理由控件的基类,添加事件向导不会更改以任何方式在类声明。 它将事件添加到控件的事件映射,并使将项记入它.IDL 文件。 将以下行添加到控件的事件映射,位于控件类实现 (.CPP) 文件:
EVENT_STOCK_KEYPRESS()
cpp
添加此代码会触发 KeyPress 事件时接收到 WM_CHAR 消息和控件处于活动状态。 通过调用其触发函数,可以在其他时间触发 KeyPress 事件 (例如, FireKeyPress) 从在控件代码内。
添加事件向导将以下代码行添加到控件的.IDL 文件:
[id(DISPID_KEYPRESS)] void KeyPress(SHORT* KeyAscii);
idl
此行将按键事件与标准的调度 ID 相关联,并允许以应对预期的 KeyPress 事件的容器。
MFC ActiveX 控件:添加自定义事件
由于时间关系,添加自定义事件我们放在下一篇来说。