您的位置:首页 > 其它

使用MFC开发ActiveX控件全过程- -

2008-09-18 20:40 288 查看
导读:
  Tag
  Visual C++是开发ActiveX控件的强大工具,它的特点是开发周期短、便于使用,因此它已经成为开发ActiveX控件的主要工具之一。Visual C++集成开发环境,使用了微软自己的类库MFC,MFC对开发ActiveX控件提供了全面的支持,本文讲述的过程均在Visual C++ 6.0(以下简称VC)中实现。
  1、 创建工程:
  对于使用过VC的人,可以很容易地创建一个开发ActiveX控件的工程,没有使用过VC的人,按
  照下面的操作步骤,也可以很快创建一个同样的工程出来。
  第一步:“File”—>“New”—>“(Projects)MFC ActiveX ControlWizard”,在“Project Name”中输入合适的工程名(以test为例),在“Location”中选择工程文件存放路径,然后,“OK”进入下一步;
  第二步:选择你想在这个工程中生成的ActiveX控件的个数(至少一个),其余选项决定是否生成一些辅助文件,通常按照默认设置即可,“Next”进入下一步;
  第三步:编辑你的工程中各个类和文件的名称,配置一些辅助选项,可以全部选择默认设置,“Finish”进入下一步;
  第四步:展示向导为你的工程生成的各种配置信息,“Cancel”重新设置不满意的选项,“OK”结束工程的创建。
  2、 绘制控件:
  MFC将对ActiveX控件的支持封装在COleControl类中,所有ActiveX控件均从这个类
  派生。绘制控件的全部操作则集中在一个虚函数中—OnDraw(),其默认实现如下:
  void CTestCtrl::OnDraw(CDC* pdc, const CRect& rcBounds, const CRect& rcInvalid)
  {
  // TODO: Replace the following code with your own drawing code.
  pdc->FillRect(rcBounds,
  CBrush::FromHandle((HBRUSH)GetStockObject(WHITE_BRUSH)));
  pdc->Ellipse(rcBounds);
  }
  可以看到,OnDraw()函数的默认实现是在矩形rcBounds中绘制一个椭圆,通过改写OnDraw()函数中的内容,就可以绘制自己想要的控件了。需要注意的一点,控件的绘制被限制在矩形rcBounds中,绘制范围不能超出这个矩形。
  3、 添加属性:
  ActiveX控件提供了三种类型的属性供用户选择:公共属性、具有通知特性的属性和Get/Set
  类型的属性。下面依次对三种类型属性的添加、初始化、新属性值的获取和属性的永久保存,分别进行介绍。
  三种类型的属性的添加,都遵照相同的步骤:“View”—>“ClassWizard”—>“(Automation)Add Property”—>“Add Property”对话框。注意,“Class Name”中应是你想添加属性的控件类的名称(如CTestCtrl)。
  ㈠.公共属性
  COleControl类提供了九种常用的属性作为公共属性,我们以“Caption”为例。在“Add Property”对话框中的“External Name”选择“Caption”,“Implementation”中选中“Stock”,然后“OK”即向控件添加了Caption公共属性。
  COleControl类为每一个公共属性都提供了默认的设置和获取成员函数,对于Caption属性有SetText()和GetText()(或InternalGetText())。
  COleControl类在函数DoPropExchange()中对于公共属性都有默认的初始化,但是我们可以在成员函数OnResetState()中,为公共属性设置我们自己想要的初始值。Caption默认的初始值为空,可以使用成员函数SetText(LPCTSTRpszText),为其设置任意的字符串。
  我们可以通过调用函数GetText()或InternalGetText()获得当前的Caption属性值。需要注意的是,对于GetText()函数,在调用之后,需要调用SysFreeString()函数以释放资源。此外,GetText()函数的返回值为BSTR类型,经常需要与大家常用的CString字符串类型进行变换:BSTR可以直接赋值CString,也可以调用API函数::SysAllocString(Cstring);但是将CString转换成BSTR,必须调用函数CString::AllocSysString()。InternalGetText()函数则无上述烦恼。
  对于公共属性的永久保存,在COleControl类的成员函数DoPropExchange()有默认实现,就无需大家费心了。
  ㈡.具有通知特性的属性
  在“Add Property”对话框的“Implementation”中选中“Member variable”,即选择了向控
  件添加具有通知特性的属性。在“External Name”中输入属性的名字(Shape),在“Type”中选择变量类型(BOOL),“Variable Name”和“Notification function”中会自动生成默认的变量名(m_shape)和通知函数名(OnShapeChanged),当然也可以手工输入自己习惯的名字。最后,“OK”便向控件添加了一个具有通知特性的属性。
  对于属性的初始化和永久保存,只要在DoPropExchange()函数中调用PX_函数即可。按照上面添加的属性例子,可以如是调用:PX_Bool(pPX, _T("Shape"), m_bShape, FALSE)。其中,“FALSE”为变量“m_bShape”即属性“Shape”的初始值。
  至此,不得不先说一下控件的属性对话框了。MFC将控件的属性对话框封装在类COlePropertyPage中,所有控件的属性对话框都派生自这个类。控件的属性对话框,是控件开发者提供给控件用户、用于定制控件外观的通讯工具,控件用户可以通过它来修改控件的某些属性。COlePropertyPage类中最重要的成员当属DoDataExchange()函数了,控件开发者就是通过在其中调用DDP_函数把控件的属性与控件属性对话框中的各种控件联系起来的。对于控件的公共属性,在为属性对话框中的相应控件添加变量的时候,可以在“Optional property name”中选择相应的公共属性,则属性对话框类就会在DoDataExchange()函数种自动添加相应的DDP_函数,例如,对于Caption属性,就会自动添加这样的语句:DDP_Text(pDX, IDC_CAPTION_EDIT, m_strCaption, _T("Caption") );但是对于用户添加的自定义属性,则必须手工输入DDP_函数,例如,对于前面添加的“Shape”属性,应添加如下语句:DDP_Check(pDX, IDC_SHAPE_CHECK, m_bShape, _T("Shape") )
  。
  对于“Notification function”需要补充说明的是,虽然在相应的函数中,属性添加向导会自动添加函数SetModifiedFlag(),但是如果需要在属性被改变时,相应改变控件的显示,则需开发人员手工加入函数InvalidateControl()(它会激发OnDraw()函数的调用)。
  ㈢.Get/Set类型的属性
  在“Add Property”对话框的“Implementation”中选中“Get/Set mothods”,即选择了向控
  件添加“Get/Set类型的属性”。 在“External Name”中输入属性的名字(Color),在“Type”中选择变量类型(OLE_COLOR),“Get function”和“Set function”中会自动生成默认的函数名“GetColor”和“SetColor”,当然也可以手工输入自己习惯的函数名。最后“OK”,便完成了向控件添加Get/Set类型的属性。
  对于属性的初始化和永久保存,和上面“具有通知特性的属性”一样,只要在DoPropExchange()函数中调用相应的PX_函数即可,不过在此之前,需要声明一个与属性类型相同的变量(m_clrInside),用于保存属性的值。(PX_函数:PX_Color(pPX, _T("Color"), m_clrInside, RGB(255, 255, 255)),其中“RGB(255, 255, 255)”为变量“m_clrInside”即属性“Color”的初始值)。
  现在,需要说明一下公共属性页的问题了:在ActiveX默认的属性页中,没有字体和颜色属性页,但我们可以通过在属性页的ID表中添加入口的方法添加这两个属性页。加入颜色属性页的代码如下:
  BEGIN_PROPPAGEIDS(CTest1Ctrl, 2)
  PROPPAGEID(CTest1PropPage::guid)
  PROPPAGEID(CLSID_CColorPropPage)
  END_PROPPAGEIDS(CTest1Ctrl)
  其中,以粗体显示的代码,由开发人员加入,同时ID数目增加1,由原来的1变为2。
  Get/Set类型的属性,属性值的获取和设置分别由相应的Get/Set函数处理。Get函数中返回当前的属性值(return m_clrInside);Set函数中设置新的属性值(m_clrInside = nNewValue),同样,如果需要在属性被改变时,改变控件的显示,需开发人员手工加入函数InvalidateControl()。
  4、 添加事件:
  事件是AcTiveX控件通知ActiveX控件容器的手段,一般事件是由一些交互操作激发的,如鼠
  标操作、键盘操作等。ActiveX控件支持公共事件和自定义事件,两者添加方法相似,只是公共事件由COleControl类自动处理。
  使用VC自带的ClassWizard添加事件:“View”—>“ClassWizard”—>“(ActiveX Events)Add Event...”,出现“Add Event”对话框。如果是添加公共事件,只要在“External Name”下拉列表中选择想要添加的事件,“OK”即可;添加自定义事件,则在“External Name”中输入自定义事件的名称(ClickIn),“Internal Name”中会自动生成事件激发函数的名称(FireClickIn),也可以输入自己习惯的名字,然后在“Parameter list”中输入需要的参数名称(Hit)和参数类型(BOOL),最后“OK”就完成了自定义事件的添加。
  对于公共事件,COleControl类会自动激发,例如:当鼠标中的任意一个键在单击控件时,Click事件就会自动被激发,向控件容器发送通知;对于自定义事件,必须由开发人员在需要激发事件的时候,调用相应的成员函数,来激发事件,以上面的“ClickIn”自定义事件为例,在需要激发事件的地方,需要开发人员调用相应的事件激发函数“FireClickIn”来激发“ClickIn”事件。附带一提,事件携带的参数是控件容器判断事件类型的依据,例如上面的“Hit”参数,其值为“TRUE”或“FALSE”,就可以代表两种不同的情形。
  5、 测试控件:
  完成了控件的编码工作,接下来就需要对控件进行相关的测试了。测试控件,就需要一个控件
  容器来装载控件,如果只是为了测试控件,而专门开发一个控件容器,根本就是本末倒置、得不偿失,开发一个ActiveX控件容器的工作量,是绝对不容小觑的!幸运的是,VC为我们提供了一个方便的ActiveX控件测试工具—“ActiveX Control Test Container”(以下简称ACTC),这是VC为ActiveX控件开发人员,方便进行ActiveX控件的测试,而专门开发的一个ActiveX控件容器。
  ACTC使用起来非常方面,可以通过两种方式打开它:一、在VC的主界面中,“Tools”—>“ActiveX Control Test Container”;二、“Execute Program”时,在跳出的“Executable For Debug Session”对话框的“Executable file name”中选择“ActiveX Control Test Container”,然后“OK”即可。
  ACTC打开之后,“Edit”—“Insert New Control”或在窗口空白处单击右键,然后选择“Insert New Control”,就会打开“Insert Control”对话框,最后在对话框左边的列表中找到自己的控件并选中,“OK”相应控件就会被添加到并显示在ACTC中。
  测试控件的属性,可以“Edit”—>“Properties...”,就会打开控件的属性对话框;测试事件,事件的结果会在ACTC下面的窗口中显示。
  - 作者: 不死鸟访问统计: 2005年08月7日, 星期日 16:02 加入博采

本文转自
http://zcphoenix.bokee.com/2512579.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: