OA办公软件与PDF文件联系紧密,PDF格式的文件也是办公人员必须掌握的!  设为首页 加入收藏夹 我来推荐 
您的位置:首页 > OA办公软件咨讯与下载 > WORD咨讯与下载
WORD咨讯与下载
在MFC应用程序中动态嵌入Word文档
日期:2009-05-23 09:09:28 人气: 标签:
打开并显示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)
 
 AfxMessageBox(IDP_FAILED_TO_CREATE);
}
END_CATCH
EndWaitCursor();

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

站点说明 | 站点导航 | 站点公告 |
OAPDF.COM版权所有 2009 V1.1