【转载】基于MFC的ActiveX控件开发(3)

原文:http://iysm.net/?p=122

3.事件

ActiveX 控件使用事件通知容器控件上发生了某些事情。事件的常见示例包括单击控件、使用键盘输入数据和控件状态更改。当发生这些操作时,控件将引发事件以提醒容器。

MFC 支持两种事件:常用和自定义。常用事件是 COleControl 类自动处理的事件。自定义事件使控件得以在该控件特定的操作发生时通知容器。控件内部状态发生更改或收到某个窗口消息即属于此类事件。

常用事件

常用事件由 COleControl 类自动引发。COleControl 包含预定义成员函数,它们引发常见操作所导致的事件。一些由 COleControl  实现的常见操作包括单击和双击控件、键盘事件和鼠标按钮状态发生更改。

添加常用事件的操作是在类视图中右击ActiveX 控件类,比如在此例中就是Caxtivexdemo1Ctrl。在菜单中选择添加事件,打开添加事件向导。

在添加事件向导中的事件名称中选择Click,也就是鼠标点击事件,添加到控件中。然后再选中类视图中库节点下的第三个节点,也就是Dactivexdemo1Events。在下面就能看到我们刚刚添加的这个事件。

然后生成新的控件程序,我们来看看测试一下这个新事件。

打开上面提到的ActiveX控件测试容器,把这个控件添加进来,用鼠标点击控件,就会在程序下方的消息栏中看到activexdemo1 Control: Click这样的消息,这就是我们添加进去的鼠标相应事件。

那在开发环境中使用控件的时候是什么样子的呢?好,像上面提到过的那样新建一个对话框项目,把控件放到对话框上。选中这个控件,在属性窗口中的控件事件中就有这个Click事件了,如果在使用控件中需要相应鼠标点击事件,就点添加ClickActivexdemo1ctrl1,事件响应函数中添加你需要的功能了。

比如像这样:

void CtestMFCDlg::ClickActivexdemo1ctrl1()

{

// TODO: 在此处添加消息处理程序代码

MessageBox(_T(“Hi.”));

}

编译运行这个测试程序,点击控件位置就会弹出带有Hi.字样的MessageBox。

自定义事件

自定义事件与常用事件的区别在于,自定义事件不由 COleControl 类自动引发。自定义事件将控件开发人员确定的某一操作识别为事件。

添加常用事件的操作是在类视图中右击ActiveX 控件类,比如在此例中就是Caxtivexdemo1Ctrl。在菜单中选择添加事件,打开添加事件向导。定义一个叫做MyEvent的事件,事件可以带参数,比如我们加个BSTR的参数msg。

然后,回到类视图,这次选中库节点下的第三个节点,也就是_Dactivexdemo1Events,在下面就会看到新添加的这个事件。

再选中类视图中的控件类,即Cactivexdemo1Ctrl,下面也会出现一个MyEvent函数。

双击这个MyEvent可以看到定义代码如下:

void MyEvent(BSTR  msg)

{

FireEvent(eventidMyEvent, EVENT_PARAM(VTS_PI1), msg);

}

这里的这个MyEvent(BSTR msg)函数就是用于触发MyEvent事件用的,什么意思呢,就是说当在控件中需要出发自定义的这个MyEvent的时候调用这个MyEvent(BSTR msg)就可以了。下面结合例子看看是怎么回事。

比如说我们希望用户鼠标双击左键的时候触发这个事件,就这么来作。选中类视图中的控件类,即Cactivexdemo1Ctrl,然后在消息窗口中找到WM_LBUTTONDBCLK,添加这个消息的处理函数。

在消息处理函数中如下修改:

void Cactivexdemo1Ctrl::OnLButtonDblClk(UINT nFlags, CPoint point)

{

// TODO: 在此添加消息处理程序代码和/或调用默认值

MyEvent(_T(“HI, MyEvent.”));

COleControl::OnLButtonDblClk(nFlags, point);

}

这样每次用户在双击控件的时候就会触发我们自定义的MyEvent事件了。

然后看一下测试效果。

打开ActiveX控件测试容器,添加这个控件,然后双击控件,看消息框里出现什么了?

由于双击自然也就是两次单击,所以会同时出现两种事件。

activexdemo1 Control: MyEvent {msg=72}

activexdemo1 Control: Click

打开测试项目,控件的控件事件里就多了一个MyEvent事件。

添加一个针对此事件的处理函数MyEventActivexdemo1ctrl1 (LPCTSTR msg),msg就是我们定义事件时的那个msg参数,在上面的定义中我们是传递了一个”HI, MyEvent.”字符串消息。现在看看是不是这个样子。在MyEventActivexdemo1ctrl1函数中我们显示一个MessageBox,把msg参数打印出来。

void CtestMFCDlg::MyEventActivexdemo1ctrl1(LPCTSTR msg)

{

// TODO: 在此处添加消息处理程序代码

MessageBox(msg);

}

同时注意要把上面常用事件中定义的Click事件的处理函数ClickActivexdemo1ctrl1注释掉,然后编译运行程序后双击控件就会弹出HI, MyEvent.对话框。也就是说,由于双击操作触发了我们定义的MyEvent事件,进而调用MyEvent的处理函数。

原文地址:https://www.cnblogs.com/zhehan54/p/4669056.html