科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件在MFC应用程序中动态嵌入Word文档

在MFC应用程序中动态嵌入Word文档

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

本文通过对自动化等COM技术的应用介绍了一种在MFC应用程序中动态嵌入Microsoft Word文档的简单方法

作者:中国电子科技集团公司第二十二研 来源:天极网 2007年10月19日

关键字:

  • 评论
  • 分享微博
  • 分享邮件
打开并显示Word文档

  在主框架类中添加ID_FILE_OPEN菜单命令响应函数,以便在打开Word文档时能够动态提供对其的支持。下面这段代码在得到Word文档文件的完整路径后,将通过发送WM_COMMAND消息来新建一个文档视图:

// 显示打开文件对话框
CFileDialog fileDlg(TRUE, "*.doc", "*.doc", OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, "Word文件(*.doc)|*.doc||", NULL);
if (fileDlg.DoModal() == IDOK)
{
 // 得到文件路径
 m_sPath = fileDlg.GetPathName();
 // 新建文档
 PostMessage(WM_COMMAND, ID_FILE_NEW, 0);
}

  并在视图类的初始化更新函数OnInitialUpdate()中完成Word的动态嵌入:

CMainFrame* pFrame = (CMainFrame*)AfxGetApp()->GetMainWnd();
if (pFrame->m_sPath.Right(3) != "DOC" && pFrame->m_sPath.Right(3) != "doc")
 return;
m_sPath = pFrame->m_sPath;
EmbedAutomateWord();
if (m_pSelection != NULL)
{
 CRect rect;
 GetClientRect(&rect);
 CDC* pDC = GetDC();
 m_pSelection->Draw(pDC,rect);
 ReleaseDC(pDC);
}
m_pSelection = NULL;

  其中,EmbedAutomateWord ()函数将负责将Word嵌入到程序。其具体实现过程如下:

BeginWaitCursor();
CEmbed_WordCntrItem* pItem = NULL;
TRY
{
 CEmbed_WordDoc* pDoc = GetDocument();
 ASSERT_VALID(pDoc);
 pItem = new CEmbed_WordCntrItem(pDoc);
 ASSERT_VALID(pItem);
 CLSID clsid;
 if (FAILED(::CLSIDFromProgID(L"Word.document", &clsid)))
  AfxThrowMemoryException();
 if (!pItem->CreateFromFile(m_sPath, clsid))
  AfxThrowMemoryException();
 pItem->DoVerb(OLEIVERB_SHOW, this);
 m_pSelection = pItem;
 pDoc->UpdateAllViews(NULL);
 LPDISPATCH lpDisp;
 lpDisp = pItem->GetIDispatch();
}
CATCH(CException, e)
{
 if (pItem != NULL)
 {
  ASSERT_VALID(pItem);
  pItem->Delete();
 }
 AfxMessageBox(IDP_FAILED_TO_CREATE);
}
END_CATCH
EndWaitCursor();

  如果仔细研究过这段代码,会发现它同AppWizard自动生成的OnInsertObject()函数有着惊人的相似程度,事实上,上述代码只不过是OnInsertObject()的一个特例:OnInsertObject()允许用户从可用的OLE对象列表中选择其一插入到应用程序中。因为在此我们只需对Word进行自动化,所以派生了这一行为。在这里通过使用CreateFromFile()方法以打开由m_sPath指定的Word文档,并通过DoVerb()方法执行OLEIVERB_SHOW动词来完成文档显示动作。为了使嵌入的工作区占满整个客户区,需要在嵌入文档、客户区大小发生变化以及更新视图后调用Draw()方法进行重新绘制。
    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章