请高人讲解下COleServerItem类与COleServerDoc类各自的作用,以及他们的联系,举个例子最好,小弟对这块很困惑,看了msdn仍然没有较清晰的认识,请大家不要吝啬自己的键盘,回帖救救我吧。

解决方案 »

  1.   

    doc是由无数的item组成的,就像文件夹包含文件夹和文件一样
      

  2.   

    为 了 支 持OLE 文 档 特 性,AppWizard 还 生 成 了 另 一 个 从COleServerItem 派 生 的 类, 实 际 上, 它 代 表 了 真 正 的OLE 对 象, 它 也 实 现 了IOleObject、IDataObject 接 口。 而 且,COleServerItem 与COleServerDoc 有 很 紧 密 的 联 系, 通 过COleServerItem::GetDocument 可 以 获 取 相 应 的COleServerDoc 对 象; 通 过COleServerDoc::GetEmbeddedItem 可 以 获 取 相 应 的COleServerItem 对 象。 因 为COleServerItem 对 象 代 表 的 是OLE 文 档 对 象, 所 以 我 们 可 以 把 读 写 数 据 处 理 以 及 对 象 自 身 的 操 作 放 在COleServerItem 的 虚 成 员 函 数 中 完 成, 而 把 通 用 的 文 档 操 作 以 及 对 象 的 编 辑 操 作 放 在COleServerDoc 以 及View 类 中 完 成。 ---- MFC 对ActiveX 文 档 的 支 持 绝 大 部 分 继 承 于 对OLE 文 档 的 支 持, 只 是 针 对ActiveX 文 档 的 新 特 性 重 载 和 添 加 了 一 些 方 法, 基 本 的 结 构 不 变。 下 面 列 出 相 应 的 改 进。 ---- 1 . 由 于COleServerDoc 是 针 对 任 意COM 组 件 的,ActiveX 文 档 侍 者 的 文 档 类 也 从COleServerDoc 派 生。 ---- 2 .ActiveX 文 档 对 象 在 包 容 器 程 序 中 运 行 时, 它 所 使 用 的 框 架 类CInPlaceFrame 从COleDocIPFrameWnd 派 生, 而COleDocIPFrameWnd 类 也 是COleIPFrameWnd 的 派 生 类。 在COleDocIPFrameWnd 中 根 据ActiveX 文 档 对 象 的 界 面 特 性, 重 载 了 框 架 改 变 大 小 操 作 的 特 性( 对 象 服 务 程 序 的 窗 口 完 全 覆 盖 了 包 容 器 的 框 架 窗 口), 并 把 它 自 己 的 菜 单 资 源 连 到 框 架 上。 ---- 3 . 代 表 文 档 对 象 的 基 类 为CDocObjectServerItem, 它 从COleServerItem 派 生。CDocObjectServerItem 类 重 载 了 一 些 操 作 特 性, 最 主 要 的 是 激 活 操 作( 通 过OnShow 或OnOpen 方 法 实 现)。 ---- 4 .CDocObjectServer 类 不 用 于OLE 文 档 服 务 程 序, 它 实 现 了 新 的ActiveX 文 档 接 口。 服 务 程 序 创 建 一 个CDocObjectServer 类 的 对 象, 并 把 它 与COleServerDoc 对 象 连 接 起 来, 我 们 可 以 在 派 生 文 档 类 的COleServerDoc::GetDocObjectServer 函 数 中 看 到 其 构 造 代 码。 然 后, 文 档 对 象 和 与 其 相 连 的CDocObjectServer 对 象 协 同 工 作, 共 同 完 成ActiveX 文 档 的 功 能。CDocObjectServer 类 实 现 了IOleDocument 和IOleDocumentView 接 口。 通 常 我 们 不 必 从CDocObjectServer 派 生 新 的 类。 
      

  3.   

    首先感谢CathySun118详尽的回答。
      

  4.   

    我在仔细看您的回帖,借此机会麻烦再问您一个问题。在msdn的CEditView的示例程序SUPERPAD 中,我仔细学习过它的源代码,令我迷惑的是他是如何响应文件保存和文件另存为操作的呢?为何我找不到相关消息映射和消息处理代码的?请您指点下。
      

  5.   

    #ifndef __PADDOC_H__
    #define __PADDOC_H__class CMyOleItem;class CPadDoc : public COleServerDoc
    /*当被容器注册的应用服务编辑该对象时,
    该对象将会被其自己的服务文档加载,一个
    COleServerDoc object 仅包含
    一个COleServerItem object*/
    {
    DECLARE_DYNCREATE(CPadDoc)public:
    CPadDoc();
    void SetSelection(int nBeg, int nEnd);public:
    virtual COleServerItem* OnGetEmbeddedItem();
    virtual COleServerItem* OnGetLinkedItem(LPCTSTR lpszItemName);protected:
    virtual void Serialize(CArchive& ar);
    virtual void DeleteContents();
    virtual ~CPadDoc(); //{{AFX_MSG(CPadDoc)
    afx_msg void OnViewUpdatenow();
    afx_msg void OnCancelInplace();
    //}}AFX_MSG
    DECLARE_MESSAGE_MAP() friend class CMyOleItem;
    };#endif