敬业的IT人 >> 编程开发 >> C/C++ >> 编写可复用性更好的C++代码:Band对象和COMToys(7)

编写可复用性更好的C++代码:Band对象和COMToys(7)

敬业的IT人 互联网 佚名 2008-1-3 19:29:30

  第一部分:Band 对象介绍

  第二部分:BandObj的类层次和MyBands服务程序的注册

  第三部分:深入Band内部,揭开Band的面纱

  第四部分:Band对象使用中遇到的一些问题

  第五部分:建立自己的COM编程平台ComToys

  第六部分:设计和构造COMToys

  第七部分 类的实现

  类的混合实现

  到目前为止,我介绍了一种用多继承代替嵌套类在MFC中实现COM对象的方法。基本思路是忽略MFC宏和接口映射,并调用GetInterfaceHook来返回接口指针。很明显,这已经使编程容易了许多,但可复用性体现在哪呢?开发COMToys的主要目的是让它具备可复用性特点来实现普通的COM接口。为此,COMToys使用了混合类。

  混合类被设计成利用多继承特性与其它类混合。通常混合类与主类的关系是直交的,也就是说它提供与类层次的无关性来避免菱形派生树(请原谅我的矛盾修饰法),不用怀疑,CBandObj比我在前面四个部分中讨论的要复杂一些,其新版本的代码如下:

//更新的 CBandObj
/////////////////////////////////////////
// CBandObj —— 典型的实现多接口的 COM 类
// 头文件.h :
class CBandObj : public CWnd,
  // interfaces
// public IOleWindow,   // 从IDeskBand继承
// public IDockingWindow, // 从IDeskBand继承
  public IDeskBand,
  public IObjectWithSite,
  public IInputObject,
// public IPersist,    // 从IPersistStream继承
  public IPersistStream,
  public ICborder="0" alt="编写可复用性更好的C++代码:Band对象和COMToys(7)" width="353" height="482" />

  图十二 CBandObj 上下文菜单 

  当容器调用IContextMenu::QueryContextMenu获得菜单项时,CTMfcContextMenu用希望的CMenu项填写菜单,但不是在创建CcmdUI对象之前,并且通过CCmdTarget发送,从而ON_UPDATE_COMMAND_UI处理器都能挂上菜单。同样,当容器调用InvokeCommand,CTMfcContextMenu发送这个命令到ON_COMMAND处理器。CTMfcContextMenu甚至能通过查找串资源来处理提示串。简言之,CTMfcContextMenu将COM语言转换成MFC语言。剩下的事情只是给它一个菜单和命令目标(通常是COM类本身)。所有的命令处理与在MFC应用中处理一样,不用再次实现IContextMenu——用COMToys就能搞掂。(待续)

转载保留:进入讨论组讨论。
粤ICP备06119539号
Copyright CiscoSky.Org,Some Rights Reserved.
Email:me1228#tom.com