将现有程序改造为OLE服务器供包容器(word,ppt)使用
2013-10-24 15:15
691 查看
http://blog.csdn.net/leohels/article/details/7580873
我们手头上经常会有现成的应用程序,但它们往往不具有OLE可视化编辑服务器的特性,可以通过简单的办法将它们升级,以供基于COM开发的包容器使用。而MS Office本身就是OLE包容器和服务器,因此经过改造的程序可以直接嵌入MS Office运行。 现有程序:ToolTip程序,基于MFC,GDI+实现的一个提示控件。将它改造成OLE服务器,以便可以在Word等包容器中使用。用VS2010进行改造步骤:创建服务器工程一、新建MFC Application工程,命名为:ToolTip。新建工程是为了获得有Wizard提供的有关OLE支持的文件,需要用来替添加并替换掉要改造的工程的部分文件。二、选择Single Document与要改造的工程一致三、选择Full server,如果需要从CSrollView继承,可最最后进行修改,如不需要,直接finish。 将OLE相关文件添加到原ToolTip工程中需要拷贝的文件有IpFrame.hIpFrame.cppSrvrItem.hSrvrItem.cppToolTip.cpp (覆盖掉原有文件、实现继承CWinAppEx的实现文件)ToolTip.regHlp\AfxOleSv.rtf(如果有帮助工程时拷贝并修改hpj文件添加此帮助文件)Res\Toolbar.bmp(覆盖原有文件)以上文件为ToolTip提供了可视化编辑的功能,是由创建了“Full Server”,AppWizard在ToolTip.cpp中添加了相应代码。在原ToolTip工程中添加以上文件。 添加OLE服务器相关代码1.StdAfx.h中添加 OLE支持的头文件#include <afxole.h>2.ToolTip.cpp的相关修改InnitInstance()函数中,主要需要关心的是
接着在ToolTip.h中添加 COleTemplateServer m_server;3.文档类的基类修改为COleServerDoc,并将CToolTipDoc.cpp中所有的CDocument替换为COleServerDoc4.为文档添加嵌入支持,通过AppWizard为CToolTipDoc添加OnGetElementItem函数,在CToolTipDoc.h类定义之前添加class CToolTipSrvrItem;前置声明。
添加OLE资源IDR_SRVR_EMBEDDED,IDR_SRVR_INPLACE的定义一开始是没有的,我们需要添加资源和ID
1.添加OLE标准资源在Resource View窗口右键选择Resource Includes,在弹出的对话框中Compile-time directives中添加 #include “afxolesv.rc”2.添加OLE菜单资源通过向导创建的OLE服务器程序,会自动生成三种不同的菜单,加速键和两种工具条。如IDR_SRVR_EMBEDDED 和IDR_SRVR_INPLACE,其他类似,这里需要打开OLE服务器的rc和当前工程的RC,对于VS2010,不能直接从别的RC复制粘贴菜单等资源到Resource View窗口里,因此需要右键*.rc文件选择Open With-》Resource Editor打开之后就可以复制粘贴了。除了复制粘贴菜单之外,还需要将IDR_MAIN中的功能菜单项复制到IDR_SRVR_EMBEDDED 和IDR_SRVR_INPLACE等特殊菜单资源中。加速键 和工具栏复制类似。 为文档类添加服务器支持1.通知OLE服务器嵌入对象被移动或者改变大小
我们手头上经常会有现成的应用程序,但它们往往不具有OLE可视化编辑服务器的特性,可以通过简单的办法将它们升级,以供基于COM开发的包容器使用。而MS Office本身就是OLE包容器和服务器,因此经过改造的程序可以直接嵌入MS Office运行。 现有程序:ToolTip程序,基于MFC,GDI+实现的一个提示控件。将它改造成OLE服务器,以便可以在Word等包容器中使用。用VS2010进行改造步骤:创建服务器工程一、新建MFC Application工程,命名为:ToolTip。新建工程是为了获得有Wizard提供的有关OLE支持的文件,需要用来替添加并替换掉要改造的工程的部分文件。二、选择Single Document与要改造的工程一致三、选择Full server,如果需要从CSrollView继承,可最最后进行修改,如不需要,直接finish。 将OLE相关文件添加到原ToolTip工程中需要拷贝的文件有IpFrame.hIpFrame.cppSrvrItem.hSrvrItem.cppToolTip.cpp (覆盖掉原有文件、实现继承CWinAppEx的实现文件)ToolTip.regHlp\AfxOleSv.rtf(如果有帮助工程时拷贝并修改hpj文件添加此帮助文件)Res\Toolbar.bmp(覆盖原有文件)以上文件为ToolTip提供了可视化编辑的功能,是由创建了“Full Server”,AppWizard在ToolTip.cpp中添加了相应代码。在原ToolTip工程中添加以上文件。 添加OLE服务器相关代码1.StdAfx.h中添加 OLE支持的头文件#include <afxole.h>2.ToolTip.cpp的相关修改InnitInstance()函数中,主要需要关心的是
pDocTemplate->SetServerInfo( IDR_SRVR_EMBEDDED,IDR_SRVR_INPLACE, RUNTIME_CLASS(CInPlaceFrame));第一个参数是被嵌入到包容器时的菜单和加速键的资源ID,第二个参数是服务器在包容器中被现场激活时的菜单,加速键,工具条的资源ID,最后一个类继承COlePFrameWnd定义了服务器被现场激活时的框架窗口的行为。
接着在ToolTip.h中添加 COleTemplateServer m_server;3.文档类的基类修改为COleServerDoc,并将CToolTipDoc.cpp中所有的CDocument替换为COleServerDoc4.为文档添加嵌入支持,通过AppWizard为CToolTipDoc添加OnGetElementItem函数,在CToolTipDoc.h类定义之前添加class CToolTipSrvrItem;前置声明。
COleServerItem* CTipDemoDoc::OnGetEmbeddedItem() { // Instead of returning NULL, return a pointer to a new COleServerItem // derived class that is used in conjunction with this document, then // remove the ASSERT(FALSE) below. (i.e., return new CMyServerItem.) CToolTipSrvrItem *pItem = new CToolTipSrvrItem(this); ASSERT_VALID(pItem); return pItem; }还可以为Doc类添加函数方便获取item:
public: CToolTipSrvrItem * GetToolTipItem() { return (CToolTipSrvrItem*)COleServerDoc::GetEmbeddedItem(); }
添加OLE资源IDR_SRVR_EMBEDDED,IDR_SRVR_INPLACE的定义一开始是没有的,我们需要添加资源和ID
1.添加OLE标准资源在Resource View窗口右键选择Resource Includes,在弹出的对话框中Compile-time directives中添加 #include “afxolesv.rc”2.添加OLE菜单资源通过向导创建的OLE服务器程序,会自动生成三种不同的菜单,加速键和两种工具条。如IDR_SRVR_EMBEDDED 和IDR_SRVR_INPLACE,其他类似,这里需要打开OLE服务器的rc和当前工程的RC,对于VS2010,不能直接从别的RC复制粘贴菜单等资源到Resource View窗口里,因此需要右键*.rc文件选择Open With-》Resource Editor打开之后就可以复制粘贴了。除了复制粘贴菜单之外,还需要将IDR_MAIN中的功能菜单项复制到IDR_SRVR_EMBEDDED 和IDR_SRVR_INPLACE等特殊菜单资源中。加速键 和工具栏复制类似。 为文档类添加服务器支持1.通知OLE服务器嵌入对象被移动或者改变大小
void CTipDemoDoc::OnSetItemRects(LPCRECT lpPosRect, LPCRECT lpClipRect) { // TODO: Add your specialized code here and/or call the base class COleServerDoc::OnSetItemRects(lpPosRect, lpClipRect); POSITION pos = GetFirstViewPosition(); CTipDemoView *pView = (CTipDemoView *)GetNextView(pos); pView->ResyncScrollSizes();//此函数为自定义函数,就是重新调整view的滚动条位置 }改变大小DOC构造函数添加:m_sizeDoc = CSize(200, 200);并提供获取函数
CSize GetDocSize(){ return m_sizeDoc; }3.如有必要还可以实现拷贝函数。
void CTipDemoDoc::OnEditCopy() { // TODO: Add your command handler code here CToolTipSrvrItem *pItem = (CToolTipSrvrItem*)GetEmbeddedItem(); pItem->CopyToClipboard(TRUE); }实现服务器对象CToolTipSrvrItem类为我们实现了服务器的大部分工作,我们只需添加程序相关代码。当服务器处于非激活状态时,会调用CToolTipSrvrItem的OnDraw函数,当处于激活状态时,会调用视图类的OnDraw进行显示。因此如果可以让CToolTipSrvrItem的OnDraw实现与View的Ondraw基本的工作。视情况而定。此次就没有实现任何功能BOOL CToolTipSrvrItem::OnGetExtent(DVASPECT dwDrawAspect, CSize& rSize)添加以下代码将窗口扩展至文档的大小
rSize = pDoc->GetDocSize(); CClientDC dc(NULL); dc.SetMapMode(MM_ANISOTROPIC); dc.SetViewportExt(dc.GetDeviceCaps(LOGPIXELSX), dc.GetDeviceCaps(LOGPIXELSY)); dc.SetWindowExt(100, -100); dc.LPtoHIMETRIC(&rSize);最终在word、excel中的效果
相关文章推荐
- 将现有程序改造为OLE服务器供包容器(word,ppt)使用
- Visual Studio 中使用Word、Excel等COM控件时如何配置服务器让程序正常运行?
- liunx网络编程(1) 使用select 改造现有代码
- 关于怎么让多个程序搭建在一个服务器上,搭建一个适合与架构师使用的开发与实现环境
- thinkphp使用http::download下载word或者ppt文件乱码问题的解决方法
- dotNet 桌面程序改造计划.下拉框篇.类似Word的颜色下拉框
- [C# 开发技巧系列]使用C#操作Word和Excel程序
- Hadoop 1.x 使用eclipse集成环境运行WordCount程序
- 使用VMware虚拟机迁移现有的服务器
- 使用Spire.Office for .NET(Word、Excel、PPT、PDF等)的初步感受
- 使用jrtplib写的一个简单服务器和客户端程序
- 无法连接到WMI提供程序。你没有权限或者该服务器无法访问。请注意你只能使用SQL SERVER 配置管理器来管理sql server 2005服务器
- 使用VMware虚拟机迁移现有的服务器及网络(7)
- 使用map关联容器实现单词转换的程序
- 如何在liunx服务器中使用supervisorctl命令启动dotnet程序?
- 转载:使用win pe模式安装win7的时候出现“安装程序无法定位现有系统分区,也无法创建新的系统分区”提示
- Node.js程序配置使用Nginx服务器(2017.11.17添加https)
- 使用VMware虚拟机迁移现有的服务器及网络
- Hadoop集群初步使用-编写wordcount程序
- Java和Android Http连接程序:使用java.net.URL 下载服务器图片到客户端