打开并显示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()方法进行重新绘制。
|