4.方法
方法就是控件开放给用户使用的一些功能函数,类似于C++的类函数。控件方法分两类,一类是常用方法,其实现由父类COleControl 提供。自定义方法由开发人员定义,由此向用户提供自定义的功能实现。
常用方法
COleControl 支持两个常用方法:DoClick 和 Refresh。Refresh 由控件的用户调用,用以立即更新控件的外观;而调用 DoClick 是用于引发控件的 Click 事件。
添加常用方法的操作是在类视图中打开库节点,在本例中就是activexdemo1Lib节点。选中第二个节点,也就是本例中的_Dactivexdemo1,在右键菜单中选择添加方法,打开添加方法向导。
在方法名中选择需要添加的常用方法。比如DoClick。
然后在类视图中选中_Dactivexdemo1,就会在下面看到我们刚才添加的那个常用方法。同时,你也可以在这里看到有一个AboutBox方法,这是系统自动给我们添加进去的,功能是显示一个About窗口,这个窗口可以在项目的资源视图中的Dialog下找到并编辑。
同样也要验证一下这个新添加的方法。还是打开ActiveX控件测试容器,添加此控件,然后点击工具栏上的这个红色方框,也就是调用方法。
在调用方法对窗口的方法名中选中我们刚添加的这个DoClick方法,然后点击调用。还记得这个DoClick是干什么的来着吗?,对了,它是要引发Click事件的,上面介绍事件的时候我们已经添加了Click这个常用事件了,那么现在调用DoClick也就是要引发我们在上面添加的这个Click事件了,于是在测试容器主窗口的消息框中出现了activexdemo1 Control: Click。
那么在开发环境中是什么效果呢?
好,再回到刚才那个测试项目里。我们先在窗体上添加一个按钮,就叫DoClick,等会用点击它的方式来调用DoClick方法。
然后为了方便操作,我们先给刚才添加到对话框中的那个控件添加一个绑定的对象变量。鼠标右击控件选择添加变量。
在添加成员变量向导中添加与此控件绑定的控件变量,比如叫做m_activexdemo。
然后,双击刚才新加到窗体上的那个按钮,即添加这个按钮的鼠标点击事件函数中,如下添加一行代码,即调用控件的DoClick方法。
void CtestMFCDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
m_activexdemo.DoClick();
}
最后,编译运行测试程序,点击DoClick按钮,结果弹出Hi.对话框。这就是说,我们通过执行控件对象的DoClick方法引发了控件的鼠标点击事件,因此上文常用事件一节中我们添加的事件处理函数ClickActivexdemo1ctrl1被执行了。
自定义方法
自定义方法与常用方法的区别在于,自定义方法未由 COleControl 实现。必须为添加到控件的每个自定义方法提供实现。
添加自定义方法的操作是在类视图中打开库节点,在本例中就是activexdemo1Lib节点。选中第二个节点,也就是本例中的_Dactivexdemo1,在右键菜单中选择添加方法,打开添加方法向导。
在添加方法向导里添加需要自定义的方法的名称、返回值和参数。
注意这里有个内部名称,默认情况是与上面的方法名一样,但是也可以修改为其他名,这个内部名称是方法在控件类内的函数名称,比如这里我们的方法名为MyThod,则选中类视图中的库接口下的第二个节点,下面会出现刚定义的MyMethod方法。
而选中控件类Cactivexdemo1Ctrl,下面会看到在这个类中定义的方法名称就是我们上面指定内部名称MyMethodInner。
而方法的具体功能也就是在这个内部函数中实现。比如我们如下定义MyMethodInner:
void Cactivexdemo1Ctrl::MyMethodInner(LPCTSTR msg)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
// TODO: 在此添加调度处理程序代码
MessageBox(msg);
}
也就是说要弹出一个消息对话框,消息内容就是参数中传递的字符串。
然后来测试一下效果,首先还是ActiveX控件测试容器,打开调用方法窗口,在方法名中会看到我们定一个MyMethod,选择之,然悔会在参数区看到我们定义的msg参数,选中,然后在下面参数值中填入你想传递给参数的值,比如hello,然后点击设置值,最后点击调用,MyMethodInner就会被执行,也就是弹出hello消息窗口。
然后再看一下使用控件开发的时候的效果。
回到测试项目,还记得那个DoClick按钮吧,还是用这个,不过有点小问题,因为上面我们为这个控件绑定控件变量的时候还没有这个自定义方法,所以在绑定的时候生成的控件类定义中没有这个方法,就无法测试了。为了省事,我们就干脆新建一个项目,像前文提到的那样添加控件,绑定控件变量,在DoClick的单击事件中写入如下代码:
void Ct1Dlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
m_activexdemo.MyMethod(_T(“This is mymethod.”));
}
编译执行,点击DoClick按钮,就会看到那个This is mymethod消息框了。