OCX控件包装类的生成

来源:互联网 发布:ubuntu 14.04 qq 2015 编辑:程序博客网 时间:2024/06/05 09:50
本人也是位学习孙鑫的VC++深入详解的初学者,在学到ActiveX控件章节时,遇到非常多的麻烦。浏览过各种各样的帖子,终于在摸索中找到了答案。楼主可以听听我的解法。

   第一步:在“解决方案管理器”中,选中项目名称“CVTest”(我命名为CVTest,用来调试前面编写的Cliok控件),右键->添加->类。在打开的添加类对话框中,选中“Active控件中的MFC类”->添加。在打开的向导中,以注册表为来源,找到Clock control控件。用下面的“_DClock”接口生成相应的类“CDClock”。完成添加。
   这时可以看到在头文件中已经有了“CDClock.h”,里面写着“由 Microsoft Visual C++ 创建的 ActiveX 控件包装类的声明”,并且还派生于CWnd类,拥有Create函数。乍一看,以为添加成功,后来发现,里面只有两个函数:“AboutBox()”和“Hello()”。我的理解是:它只包含我们在Clock控件中添加的显性的方法,也就是指,可以由自己添加几行代码就可以完成的方法,不需要MFC内部机制完成。总之,这是个极不完整的控件类,需要继续添加原控件方法、属性、事件。

   第二步:仍然是同第一步的方法,打开添加类的对话框。这次选择添加“TypeLib中的MFC类”,找到Clock control控件。可以发现这次的接口有两个“_DClock”和“_DClockEvents”。把它们的类都添加上,由于第一步已经有一个“CDClock.h”了,所以它新生成的类为“CDClock0.h”,“CDClockEvents.h”。
   我们也打开这两个类,发现它们就包含了其他的方法和属性等。但是,一个控件怎么会生成这么多类呢?肯定有问题。通过比较,发现CDClockEvents和CDClock0类都派生于COleDispatchDriver这个类,并且都是调用父类的InvokeHelper()函数实现自己的方法。由此,我们可以淡定的把CDClockEvents类中的成员函数Click()和NewMinute(),都复制到CDClock0类中,然后直接删掉“CDClockEvents.h”。如此,就简化掉一个类。
   继续分析CDClock类和CDClock0类,发现CDClock类虽然派生于CWnd,但通过GetClsid()函数,得到了控件中的CLSID,也就是用这个函数也能关联到COleDispatchDriver这个类上去(个人形象的理解,真正的机理我也不懂)。并且通过MSDN查InvokeHelper()函数,发现CWnd和COleDispatchDriver类都有这个函数,都用它实现了AboutBox()和Hello()。那么我们就可以断定CDClock类和CDClock0类的成员函数(方法)多半是可以相互移植的。

   第三步:把CDClock0类中的函数复制到CDClock类中去,再删掉“CDClock0.h”。

   最后:调试运行,无误;把孙鑫那剩下的代码写完,再运行,成功!

   感叹一下,用VS2008去学VC6.0的人,真是伤不起啊!!!
0 0
原创粉丝点击