对于OLE的WORD对话框嵌入网上有教程,但是为了自己的学习,也不惜与别人的重复了,这算是个总结吧
环境:WIN7+VS2010+OFFICE2010
1.创建一个基于单视图的MFC程序名称为NO吧,只是注意一点,在创建时要注意设置成容器类型
2.在类向导中添加类->类型库中的MFC类,根据文件选择,笔者的是C:\Program Files\Microsoft Office\Office14中的MSWORD.OLB,然后将所有的类都生成,点击确定,退出
3.因为选择了容器类型,所以含有CNOCntrItem类,在该类中声明一个LPDISPATCH GetIDispatch();
LPDISPATCH CNOCntrItem::GetIDispatch()
{
ASSERT_VALID(this);
ASSERT(m_lpObject != NULL);这是父类的一个变量
LPUNKNOWN lpUnk = m_lpObject;
//Run在调用Active或者DoVerb之前启动服务程序,一般也是有这俩函数自行调用的,我们自己调用的话,则是在DoVerb之前设置item的
//属性比如SetExtent
Run();
LPOLELINK lpOleLink = NULL;
if(m_lpObject->QueryInterface(IID_IOleLink,(LPVOID FAR*)&lpOleLink)== NOERROR)
{
//IOleLink使链接的对象,提供其与连接功能有关的容器不需要自己实现一般用于容器应用程序嵌入对象
ASSERT(lpOleLink != NULL);
lpUnk = NULL;
//GetBoundSource检索一个指针链接源,是否连接处于活动状态
if(lpOleLink->GetBoundSource(&lpUnk) != NOERROR)
{
TRACE0("Warning: Link is not connected!\n");
lpOleLink->Release();
}
ASSERT(lpUnk != NULL);
}
LPDISPATCH lpDispatch = NULL;
//进行连接过程
if(lpUnk->QueryInterface(IID_IDispatch,(LPVOID FAR*)&lpDispatch) != NOERROR)
{
TRACE0("Waring: does not support IDispatch!\n");
return NULL;
}
ASSERT(lpDispatch != NULL);
return lpDispatch;
然后在CNOView中添加void EmbedAutomateWord()的函数声明具体代码如下
BeginWaitCursor();//设置鼠标状态成为忙状态
CNOCntrItem* pItem = NULL;
TRY
{
CNODoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
pItem = new CNOCntrItem(pDoc);//当前的CNODoc作为参数传递给新建的CNOItem
ASSERT_VALID(pItem);
GetClientRect(&pItem->rect);//CNOCntrItem没有rect的定义,需要自己加
CLSID clsid;
if(FAILED(::CLSIDFromProgID(L"Word.document",&clsid)));//启动Word程序
AfxThrowMemoryException();
if(!pItem->CreateNewItem(clsid))//将Word加载到新建的Item当中
AfxThrowMemoryException();
ASSERT_VALID(pItem);
pItem->DoVerb(OLEIVERB_SHOW, this); 打开一个对象,进行编辑。也就是说,该item将要进行显示
m_pSelection = pItem;
pDoc->UpdateAllViews(NULL);//刷新Doc
LPDISPATCH lpDisp;
lpDisp = pItem->GetIDispatch();//进行连接
}
CATCH(CException, e)
{
if (pItem != NULL)
{
ASSERT_VALID(pItem);
pItem->Delete();
}
AfxMessageBox(IDP_FAILED_TO_CREATE);
}
END_CATCH
EndWaitCursor();
}
//接下来要做的边只是在CNOView类中编辑OnInitUpDate函数
CView::OnInitialUpdate();
EmbedAutomateWord(); //将Word嵌入
m_pSelection = NULL;
如下图所示