您的位置:软件 > 开发者网络 > 开发工具 > 开发专栏 > VC > 正文
ActiveX控件中多控制的设计与实现
[文章信息]
作者:潘爱民
时间:2002-07-18
出处:COM集中营
责任编辑:
[文章导读]
ActiveX是Microsoft新近提出的一种技术,它以COM(Component Object Model,组件对象模型)为基础......
advertisement
热点推荐
· 专业设计的魅力:精确的定位
· 在金山文字中输入文字
· 认识磁盘
· 小小的精彩Flash:广告作品
· 小小的精彩Flash:过关斩将II
[正文]

1 2  下一页

  ActiveX是Microsoft新近提出的一种技术,它以COM(Component Object Model,组件对象模型)为基础,其中包括了OLE技术以及应用于Internet的多种技术。它使得不同的进程(甚至是网络上的进程)之间可相互通信,并且朝着多媒体方向发展。

  ActiveX是一种面向对象的组件系统,其中包括了组件软件的各个方面,有复合文档、自定义控制、OLE自动化、交互应用程序脚本、数据传送及其它分布式软件的相互作用。这些组件对象为用户提供了各种不同的的功能,使得不同软件供应商提供的组件可在二进制级进行相互连接和通信。对象通过接口实现组件之间及组件与系统之间的相互作用。

  在桌面系统进行软件交互时,除了系统提供的标准控制外,OLE控件是一个重要的组成部分。最初的VBX(Visual Basic 控件)结构由于没有被设计成一个独立的、标准的界面而与Visual Basic的设计环境密切相关,很难与其它开发工具、应用软件和对象组合工作。Microsoft在公布OLE 2.0 之后,就推出了OLE控件以取代VBX控件。随着ActiveX技术的进一步发展,新的ActiveX控件继承了OLE控件的特性,同时还弥补了OLE接口与Internet之间的冲突。ActiveX控件在两个方面的表现尤为突出:首先,开发人员可以将控件加到自己的主页上,还能够在网上传递。利用FrontPage等主页出版工具,可在主页中加入ActiveX控件,或者编写HTML代码直接将控件加到主页中。ActiveX控件能激活Web页面,在页面中增加了Client/Server能力,允许Web网点的访问者执行复杂的操作,从数据库或其它服务器甚至其它Web网点上的应用程序接收数据。其次,ActiveX控件还可以用于 VB、FoxPro、VC和Access等拥有Control Container功能的应用程序。我们可用 Visual C++开发出应用程序所需的控件,再将控件放到FoxPro及其它环境下使用。这样就在不同的编程语言之间架起了一座桥梁,既方便了编程者,又拓展了各种编程语言开发程序的能力。

  本文着重介绍应用程序中ActiveX控件的开发,以Visual C++ 5.0为工具,利用系统提供的AppWizard快速构造一个简单的ActiveX控件。此外,借助于MFC类库的强有力支持,我们还可在控件中实现更多较复杂的实际应用功能。

  一、ActiveX控件的设计方法

  在Microsoft Developer Studio环境下,按如下的操作步骤可以快速生成一个标准的ActiveX控件。首先,启动系统的AppWizard,用File菜单下的New菜单项创建新的项目。注意:我们选择的是列表框中的MFC ActiveX ControlWizard项。也可以使用ATL COM AppWizard项来产生ActiveX控件,这样实现的控件的最终代码量较小,但由于用这种方法加入的ActiveX控件对象从最基本的COM对象出发,故不能使用MFC类库中的COleControl所提供的强大功能。而用MFC ActiveX Cont rolWizard项则产生以COleControl为基类的控件对象类,它继承了所有COleCont rol类中实现的OLE控件的特性,包括窗口对象特性和方法、属性及事件等。接着,按照系统给出的提示信息逐步完成创建工作。用户可根据实际应用的要求定制控件的各项特性。

  我们假定项目名为Test。创建工作完成后,打开Workspace文件Test.dsw,可以看到系统生成的Test控件框架,主要的类及实现功能描述见下表:

  派生类 基类 实现功能

  CTestApp COleControlModule 控件实例的初始化和撤消

  CTestCtrl COleControl 控件窗口的创建、更新及消息处理

  CTestPropPage COlePropertyPage 控件属性页的设置及与实际属性值的交换

  编译此项目,生成Test.ocx。在当前的Developer Studio环境下,这个控件已经被自动注册了。用系统提供的工具ActiveX Control Test Container可以立即进行测试,在已提供的可插入OLE控件列表中,Test Control就是我们生成的控件名。如果想在其它环境下使用它,则必须先对Test.ocx文件进行注册,具体做法是在命令行方式下键入命令:“regsvr32 …\Test.ocx”。此后,我们就可在任何支持ActiveX控件的环境中使用它了。注意:.ocx文件应该随时更新和注册。

  当然,这样生成的控件没有什么实质性的用处,若在任何一个包容器中测试它,则只可见一个矩形框和一个内切椭圆,除了缩放和位置移动功能外不能进行任何操作。

  然而,我们希望开发出来的控件就像一个通常的编辑环境一样:用户可以在窗口内进行文本的输入和编辑,而且有工具条来支持各项操作。

  1.为控件添加工具条和子窗口

  VC++的模板常常是很有用的工具,我们设计一个类CToolbar,为控件类T添加工具条,显示每个按钮及提示信息。我们的控件类CtestCtrl是从这个类派生出来的,从而可为控件加上设计好了的工具条。

  以下是实现工具条模板类的定义 (在Toolbar.h文件中) :

  template
  class CToolbar
  {
  public:
   CToolbar();
   void CreateToolbar(HWND hParent);// 创建工具条
   void AddButtons();// 逐个加入按钮
   void DestroyToolbar();// 撤消工具条
   LRESULT OnToolbarNeedText(WPARAM, LPNMHDR pnmh, BOOL&);
  // 工具条上按钮的提示信息
  protected:
   HWND m_hwndToolbar;// 工具条的窗口句柄
  };

  接着,要对TestCtl.h和TestCtl.cpp作相应的修改。在TestCtl.h中要先包含 Toolbar.h文件,并将控件类定义为:

  class CTestCtrl : public COleControl, public CToolbar
  然后,再加进消息映射宏:
  BEGIN_TOOLBAR_MAP(CTestCtrl)
   TOOLBAR_BUTTON(ID_New)
   TOOLBAR_SEPARATOR()
   TOOLBAR_BUTTON(ID_CUT)
   ......
   TOOLBAR_SEPARATOR()
   ......
  END_TOOLBAR_MAP()

  以响应定制的工具条上的各个按钮消息。上面的宏在Toolbar.h文件中被定义于是,在CTestCtrl类的成员函数中就可以灵活使用CToolbar类的各项操作了。

  另外,我们再为控件设计一个可编辑的子窗口。这实现起来很方便,在控件类定义中直接加入CEdit类的对象作为成员变量m_TestEdit即可。

  要想真正生成我们自己的控件窗口,则需重载COleControl::CreateControl Window函数。控件窗口被创建时,该函数被调用,函数中先调用基类同名函数,再依次调用CreateToolbar和CreateTestEdit 生成控件中的工具条和子窗口。自然,我们不再需要系统缺省调用的画图函数,将CTestCtrl::OnDraw 中画矩形框和椭圆的部分去掉。CreateToolbar在工具条模板类中实现;CreateTestEdit 在控件类中自定义,函数先计算控件窗口的客户区和工具条的窗口大小,得到子窗口的位置,使之填满控件中工具条以外的全部区域,然后调用m_TestEdit.Creat e函数,设置参数使子窗口具有用户所希望的各项风格。

  2.调整控件窗口中各个对象的位置

  工具条和子窗口已经在控件中生成后,还有一项重要的工作就是当控件位置移动或大小改变时,要相应地调整工具条和子窗口的位置和大小。

  COleControl类为我们提供了这样的函数:

  COleControl::OnSetObjectRects(LPCRECT lpRectPos, LPCRECT lpRectClip);

  其中的参数给出了控件的新位置。重载此函数,先按系统提供的功能自动调整工具条,调用:

  ::SendMessage(m_hwndToolbar, TB_AUTOSIZE, 0L, 0L)

  然后,同创建时一样计算控件窗口的客户区(参数lpRectPos已给出),调用 GetWindowRect获得工具条的窗口大小。为使子窗口填满控件中工具条以外的全部区域,应先计算出相应的矩形位置并调用m_TestEdit.SetWindowPos来 实现子窗口的位置调整。为了美观起见,也可在子窗口的四边留出少许富余。最后,调用基类的OnSetObjectRects函数。

  3.实现对控件内对象的控制

  因为有了子窗口,实际上用户的各项功能操作都是由子窗口来控制完成的。我们将焦点的控制权交给子窗口,使用户能进行输入和编辑操作,在CTestCtrl: : OnSetFocus中调用m_TestEdit.SetFocus。同样,当控件对象捕获到工具条上的按钮被按下的消息时,要调用 m_TestEdit 的相应函数以执行用户的命令。

  工具条上提示信息的显示也由控件对象来控制。在CTestCtrl::OnNotify函数中加入如下代码:
  NMHDR *pNMHDR = (NMHDR *)lParam;
  BOOL tmp;
  if (pNMHDR->code == TTN_NEEDTEXT)
   return OnToolbarNeedText(wParam, pNMHDR, tmp);

  这样,当鼠标移动并停留在工具条的某个按钮上时,控件对象就会调用工具条模板类中的OnToolbarNeedText 函数以获得相应的提示信息。

  4.控件窗口及内部对象的撤消

  最后需要说明的是,如果我们在控件中创建了新的工具条和子窗口,则也应该及时撤消控件窗口及其内部对象。撤消控件窗口,即是在 CTestEdit::OnDest roy函数中依次调用DestroyToolbar和 m_TestEdit.DestroyWindow 来清除工具条和子窗口。

  遵循以上四个工作步骤就可以很好地创建一个带有工具条和编辑子窗口的Ac tiveX控件。子窗口可由用户自己定义,象通常的应用程序那样去实现各种各样或简单或复杂的功能。工具条的存在使用户执行各项操作更加方便。此外,在控件中加进其它各种所需的对象并进行控制也是可能的。


1 2  下一页

·"WAP天极之IT新闻资讯,50万元等你拿"    ·天极WAP之游戏狂图,50万元等你下载

天极社区邀请您:写博客日记  上传相片   论坛聊天  订阅电子杂志  推荐网摘   免费图铃工具
笔名:   请您注意:

 遵守国家有关法律、法规,尊重网上道德,承担一切因您的行为而直接或间接引起的法律责任。

 天极网拥有管理笔名和留言的一切权利。
评论:
 

发表评论推荐给朋友我想参加相关培训打印我对此感兴趣订阅电子杂志
相关内容阅读排行榜
  • [配置推荐]4100元高性价比配置
  • 软件频道电脑应用多媒体教程
  • 专业设计的魅力:精确的定位
  • 在金山文字中输入文字
  • 认识磁盘
  • 小小的精彩Flash:广告作品
  • 小小的精彩Flash:过关斩将II
  • 11.19精选 闪客五周年作品展
  • Advertisement

    天极无线
    待机彩图    >>更多
    多彩动画    >>更多
    美妙和弦    >>更多
    天使在唱歌
    壁虎漫步
    PrettyBoy
    LoveLoveLove
    我是你的小小狗
    单身情歌
    十面埋伏
    祝酒歌
    回心转意
    波斯猫
    太委屈
    S.H.E
    潘玮柏
    M2M
    蔡依林
    阿牛
    林志炫
    陈弈迅
    刀郎
    黑龙
    S.H.E
    陶晶莹
    情人玫瑰坊
    音乐风云
    新片速递
    神秘测试
    都市约会
    ·天极彩信天天精彩
    ·图铃梦工厂下载无限!
    ·找寻童真,卡通专题
    ·夏日激情交友社区!
    ·星座运程,预测人生

    CSEEK搜索