设为首页 加入收藏

TOP

在MFC应用程序中动态嵌入Word文档(二)
2012-11-04 15:12:28 来源: 作者: 【 】 浏览:623
Tags:MFC 应用程序 动态 嵌入 Word 文档
  打开并显示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()方法进行重新绘制。

首页 上一页 1 2 3 下一页 尾页 2/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇深入探讨MFC消息循环和消息泵 下一篇ADO与ODBC的区别

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: