/*by:rush date:2011年6月22日 20:07:56*/
/*vc编写Activex控件全过程*/
最近在自己的项目中使用了ActiveX控件。在这里就不介绍ActiveX控件的相关知识给大家扫盲了,我们直接进入编程。
1、新建控件工程
在新建项目时,选择新建ActiveX控件,如下图所示:
其他的基本可以选择默认属性,然后我们就可以进入自己新建的工程了,如右下图所示。方框中标出的是新建控件之后自带的三个类。我做的控件只是使用了C***Ctrl这个类,主要是设置一些与外界进行数据通信的接口的属性的,我自定义的几个属性都是在这里完成编程的。
2、为控件添加对话框
这个控件的思想其实不是我的原创,只是项目的变化而产生的,而之前我是基于传统的上位机软件来编写这个程序的,所以就选择了向控件中加载对话框的方法。首先是设置对话框的ID,这里假设对话框的ID为IDD_XY_DLG,然后我们可以在C***Ctrl中的OnCreate() 函数中添加对话框的加载程序,具体的程序如下:
int C***Ctrl::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (COleControl::OnCreate(lpCreateStruct) == -1)
return -1;
dlg.Create(IDD_XY_DLG,this);
dlg.ShowWindow(SW_SHOW);
return 0;
}
对话框添加完之后,对对话框的操作与基于对话框的操作时完全一致的。所以这里没有什么好讲的。我自己的对话框的编写也基本移植的之前自己编写的上位机的程序。
3、为控件添加属性
制作控件的一个重要原因就是要提高程序的通用性,而通用性的提高必须是控件能够与第三方程序进行数据交换,这里的数据交换就是通过控件的属性来完成的。现在我们来讲一下添加属性的步骤。View->ClassWizard->Automation后进入添加界面,如下图所示:
注意上图中红色直线标注的部分,我们是在C***Ctrl类下来进行属性的添加,做为示范,我们用两种方法分别添加两个属性。
(1)在上图中点击Add Property按钮添加新的属性名称,如下图所示。
我们添加一个名字为xy0的float型属性,这里需要注意的是最上面的External name上填写的是控件属性的外部名称,就是第三方用户在使用你的控件时看到的属性名称,而系统会自动为你生成一个Variable name名称来关联你添加的属性的外部名称。我们在控件内部编程时只需要调用内部变量就可以了。现在我们来使用Member variable属性创建属性,这种方式不需要自己编写关联,而是系统自己为你添加。一路点击OK就可以完成属性的添加,我们可以看到在C***Ctrl类上新增了与新添加的属性相对应的程序,这个程序相当于属性值发生改变的回调函数,具体的程序如下:
void C***Ctrl::OnXy0Changed()
{
// 添加属性值发生改变后需要控件进行的相应的操作
SetModifiedFlag();
}
(2)使用Get/Set methods属性创建属性。
使用这种方法添加的属性,我们需要自己编写获取控件属性函数和改变控件属性程序。在我做的项目中,使用这种方法比较的多,我们以新建一个float型的C5属性做为例子,添加属性后,我们可以看到系统新增了两个函数——GetSC5() 和SetC5() ,对应着获取属性的值和设置属性的值,具体的程序如下:
float C***Ctrl::GetSC5()
{
// 获取C5属性相应的操作
return f0.0; //返回属性值
}
void C***Ctrl::SetC5(float newValue)
{
// 设置C5属性相应的操作
SetModifiedFlag();
}