MFC的ActiveX控件开发(属性)

来源:互联网 发布:相机记忆卡数据恢复 编辑:程序博客网 时间:2024/04/29 03:50
属性

属性是 ActiveX 控件中向所有容器公开的数据成员。与事件和方法类似,也分为常用属性和自定义属性。

常用属性

常用属性已由 COleControl 类实现。COleControl 类包含支持控件的通用属性的预定义成员函数。某些通用属性包括控件的标题以及前景色和背景色。

添加常用属性的操作是在类视图中打开库节点,在本例中就是activexdemo1Lib节点。选中第二个节点,也就是本例中的_Dactivexdemo1,在右键菜单中选择添加属性,打开添加属性向导。选中实现类型下的常用,在属性名下选择要添加的属性,比如在此我们选择的是Caption。

然后在类视图中就能看到新添加的这个属性。

这个Caption也就是我们在使用控件进行开发的时候,控件属性窗口中的那个Caption属性。

在开发环境中我们可以用控件变量的GetCaption和SetCaption来获取和设定控件的这个属性。

比如在测试项目中的DoClick按钮的点击事件函数中如下修改:

void Ct1Dlg::OnBnClickedButton1()

{

// TODO: 在此添加控件通知处理程序代码

MessageBox(m_activexdemo.GetCaption());

m_activexdemo.SetCaption(_T(”change”));

MessageBox(m_activexdemo.GetCaption());

}

这样在点击DoClick按钮的时候会显示控件的Caption名称对话框,然后修改名称,再把修改后的名称显示在弹出的对话框中。

如果是在ActiveX控件测试容器中的话,我们还是打开调用方法窗口,在方法名中会看到Caption(ProPut)和Caption(ProGet)的方法,也就是对应上面的SetCaption 和GetCaption,同样在这里也可以试着给Caption修改内容并获取修改后的值。

自定义属性

自定义属性与常用属性的区别在于,自定义属性未由 COleControl 类实现。自定义属性用于将 ActiveX 控件的某个状态或外观向使用该控件的程序员公开。

添加自定义属性的操作是在类视图中打开库节点,在本例中就是activexdemo1Lib节点。选中第二个节点,也就是本例中的_Dactivexdemo1,在右键菜单中选择添加属性,打开添加属性向导。这里自定义属性有成员变量和Get/Set方法两种。

成员变量属性

我们先看一下成员变量这种属性。根据需要选择属性的类型,并填入属性名,同时变量名和通知函数会被自动填入,如不满意默认的名称也可以手动修改这两个名称。

其中这个变量名是作为控件类的一个成员变量来存储控件属性的,比如选中类视图中的的控件类,也就是Cactivexdemo1Ctrl,就会在下面看到这个m_MyProp1成员变量。

这种自定义属性的使用与常用属性类似,在ActiveX控件测试容器中也是有着MyProp1(ProPut)和MyProp1 (ProGet)这样的方法以供测试时调用,在开发时也会有属性出现在控件的属性窗口中,在程序中也是可以通过GetMyProp1和SetMyProp1来获取和设置属性值。

而通知函数是当这个属性被修改是所触发的一个函数。被定义为控件类中的一个成员函数。

举个例子,假如我们在这个函数中写入如下代码:

void Cactivexdemo1Ctrl::OnMyProp1Changed(void)

{

AFX_MANAGE_STATE(AfxGetStaticModuleState());

 

// TODO: 在此添加属性处理程序代码

MessageBox(_T(”MyProp1 Changed.”));

 

SetModifiedFlag();

}

然后在ActiveX控件测试容器中调用MyProp1(PropPut)来修改这个属性值,则会弹出这个对话框。同样的,在开发时如果在属性窗口中修改此属性值或在代码里修改此属性值都会触发这个通知函数,进而弹出我们代码中的对话框。

Get/Set方法型属性

添加Get/Set方法型属性则是在添加属性向导窗口中的实现类型中选中Get/Set方法,指定属性类型和属性名,向导会自动填入Get和Set函数,同时可以指定自定义的参数。

然后在控件类的定义中就会出现GetMyProp2(void)和SetMyProp2(LPCTSTR newVal)两个函数,分别用于获取和设置属性值。但要注意的是,如果看一下这两个函数的代码的话,这两个自动生成的函数实际上并没有真正起到获取和设置属性值的功能,这只是两个框架,基本上什么也没做,如果放在ActiveX控件测试容器中调用这两个函数的话会看不到什么反应,于是就还需要我们来手动定义函数的具体功能。

比如说我们可以为控件类添加一个成员变量用来存储我们的属性值,由于我们这个属性定义的是BSTR类型,我们可以把添加的这个成员变量声明为CString m_MyProp2,然后分别修改GetMyProp2(void)和SetMyProp2(LPCTSTR newVal)为如下:

BSTR Cactivexdemo1Ctrl::GetMyProp2(void)

{

AFX_MANAGE_STATE(AfxGetStaticModuleState());

 

CString strResult(m_MyProp2);

 

// TODO: 在此添加调度处理程序代码

 

return strResult.AllocSysString();

}

 

void Cactivexdemo1Ctrl::SetMyProp2(LPCTSTR newVal)

{

AFX_MANAGE_STATE(AfxGetStaticModuleState());

 

// TODO: 在此添加属性处理程序代码

m_MyProp2=newVal;

 

SetModifiedFlag();

}

然后在ActiveX控件测试容器中先调用SetMyProp2给属性赋值,然后用GetMyProp2就能返回刚才新赋的属性值了。

另外要注意的是,刚才定义这个属性的时候,参数列表是留空的,默认得到的就是上面SetMyProp2和GetMyProp2两个函数,如果在参数列表里添加了其他参数的话,那么新加的参数就会被添加到这两个函数的参数列表中去。比如我们添加个BSTR型属性MyProp3,在参数列表里加上一个LONG arg参数,那么得到的两个函数将是GetMyProp3(LONG arg)和SetMyProp3(LONG arg, BSTR newVal)。

原创粉丝点击