MFC视图模式下添加WORD编辑框

对于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;

如下图所示


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

世纪殇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值