⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 officectrl.cpp

📁 让powerpoint支持插入internet资源
💻 CPP
字号:
// OfficeCtrl.cpp: implementation of the COfficeCtrl class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "resource.h"
#include "OfficeCtrl.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

COfficeCtrl::COfficeCtrl()
{		
	//需在外部初始化PowerPoint 2000应用程序对象指针初始化该值
	//否则该类相关函数将不会完成相关操作
	//这里初始化为NULL
   m_pPPT=NULL;
}

COfficeCtrl::~COfficeCtrl()
{
  //该类并不负责对于m_pPPT所指的PowerPoint应用程序对象的析构

}
// 分析URL字符串,到出资源真实路径
CString COfficeCtrl::getResPath(CString url)
{
    CString sToken="?fileURL=";
    int idx=url.Find(sToken); 
    CString returnStr=url.Right(url.GetLength() - (sToken.GetLength()+idx) );
	return returnStr;
}

// 分析URL字符串,得出资源的类型(后缀名),其中将调用getResPath函数
CString COfficeCtrl::getResType(CString url)
{
	CString filePath=getResPath(url);
    CString sToken=".";
    int idx=filePath.ReverseFind(*sToken.GetBuffer(1)); 
	CString returnStr=filePath.Right(filePath.GetLength() - (sToken.GetLength()+idx) );
	return returnStr;
}

// 将资源插入到PowerPoint 2000中,将调用getResType()分析出资源类型,然后按一定的方式将getResPath()所表示的资源插入
bool COfficeCtrl::insertResToPowerPoint(CString url)
{
	if(m_pPPT==NULL){
		//需在外部初始化PowerPoint 2000应用程序对象指针初始化该值
		//否则该函数将不会完成相关操作
          return false;
		/*
		//如果必要,也可用以下代码创建该对象,但会有相关负面影响
		HRESULT hr;
		hr = CoInitialize(NULL);
		if (FAILED(hr)) {
			return FALSE;
		}

		hr =CoCreateInstance(MSPPT::CLSID_Application, NULL, 
		CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER, 
		MSPPT::IID__Application, (LPVOID*)&m_pPPT);

		if (!m_pPPT) {
		   return FALSE;
		}
		*/
	}

  
         //将 PowerPoint 2000应用程序激活
         //m_ppt.Activate();
		 m_pPPT->Activate();
         //得到CPresentations对象
         //Presentations oPresentations=m_pPPT->GetPresentations();
		 MSPPT::PresentationsPtr lpPresentations=m_pPPT->GetPresentations();

	     //CComPtr<MSPPT::Presentations>  oPresentations;
		 
         //如果CPresentations的个数为0,说明没有一个PowerPoint文档已打开,系统自动打开一个PowerPoint文档
		 if(lpPresentations->GetCount()==0){
             lpPresentations->Add(Office::msoTrue); 
		 }
        // 得到当前活动文档窗口
		// DocumentWindow oDocumentWindow=m_ppt.GetActiveWindow();
	 MSPPT::DocumentWindowPtr	 lpDocumentWindow=m_pPPT->GetActiveWindow();
		 //得到活动文档窗口的视图对象
	 MSPPT::ViewPtr lpView=lpDocumentWindow->GetView();
         //得到活动的PowerPoint文档程序CPresentation对象

	 MSPPT::_PresentationPtr lpPresentation= m_pPPT->GetActivePresentation();
		 //得到给PowerPoint文档的幻灯片集合对象(CSlides)
	 MSPPT::SlidesPtr  lpSlides=lpPresentation->GetSlides();
         int slideIndex;
         if(lpSlides->GetCount()==0){
		 //若幻灯片个数为0,说明没有可用的幻灯片,系统自动插入一幻灯片,然后得到当前活动的幻灯片索引号(slideIndex)
			 MSPPT::_SlidePtr  lpSlide=lpSlides->Add(1,MSPPT::ppLayoutText);
	        slideIndex=lpSlide->GetSlideIndex();
			//将视图跳转到新增加的幻灯片处
            lpView->GotoSlide(slideIndex);
		 }else{
		//若已有可用的幻灯片,则直接得到当前活动的幻灯片索引号(slideIndex)
			 MSPPT::_SlidePtr lpSlide=lpView->GetSlide();
			 slideIndex=lpSlide->GetSlideIndex();
		 }
         //不管是新增的幻灯片,还是已有可用的幻灯片,都得到当前可用的幻灯片对象
         VARIANT varIndex;
		 varIndex.intVal=slideIndex;
		 varIndex.vt=VT_I4;
		 MSPPT::_SlidePtr lpSlide=lpSlides->Item(varIndex);
        //得到当前幻灯片上所有的CShapes对象,以便增加我们将要插入的资源相关的Shape对象
		  MSPPT::ShapesPtr lpShapes=lpSlide->GetShapes();
		 //得到资源类型
         CString resType=getResType(url);
		 //将资源标识符小写化处理
		 resType.MakeLower();
	     

		 
         //为图片资源时,插入“Forms.HTML:image.1”对象,以在PowerPoint 2000中显示图片资源
    	 if (resType== "bmp"
			 || resType== "gif"
			 || resType== "jpg"
			 || resType== "ico"
			 || resType== "pcx"
			 || resType== "png"
			 || resType== "psd"
			 || resType== "tif"){
			 
				 MSPPT::ShapePtr lpShape=lpShapes->AddOLEObject(162,114,-1,-1,"Forms.HTML:image.1","",Office::msoFalse, "", 0, "", Office::msoTrue);
                          //得到Shape的格式化对象
					
			 MSPPT::OLEFormatPtr 	 lpOLEFormat=lpShape->GetOLEFormat();
 //从COLEFormat中得到IDispatch*接口,以备调用Forms.HTML:image控件的IDispatch接口,设置该控件的图片来源Source属性
						 IDispatch*  pDisp=lpOLEFormat->GetObject();
         
						
          //查询Forms.HTML:image控件的图片来源Source属性的 DISPID值
						 DISPID      dispID;
						 OLECHAR    *szSource = L"Source";

						 pDisp->GetIDsOfNames(IID_NULL, &szSource, 1,
							LOCALE_USER_DEFAULT, &dispID);
         
						 DISPPARAMS dispParams = { NULL, NULL, 0, 0 };
						 DISPID dispidNamed = DISPID_PROPERTYPUT;
						 CComVariant vrURL(getResPath(url));  

						 dispParams.cArgs = 1;
						 dispParams.rgvarg = &vrURL;
						 dispParams.cNamedArgs = 1;
						 dispParams.rgdispidNamedArgs = &dispidNamed;
//通过IDispatch的Invoke函数设置图片来源Source属性为资源的真实路径
						 pDisp->Invoke(dispID, IID_NULL, LOCALE_SYSTEM_DEFAULT,
							DISPATCH_PROPERTYPUT | DISPATCH_METHOD, &dispParams,
							NULL, NULL, NULL);
						 pDisp->Release();

			 }
//为视频声音等资源时,插入MediaPlayer.MediaPlayer.1对象已显示资源
			 if(resType== "avi" 
			  || resType==  "mp3"
			  || resType==  "wav" 
			  || resType==  "mid" 
			  || resType==  "midi" 
			  || resType==  "mov" 
			  || resType==  "mpeg" 
			  || resType==  "mpg" 
			  || resType==  "wmf" 
			  || resType==  "wmv"){
                         
	          MSPPT::ShapePtr lpShape=lpShapes->AddOLEObject(162,114,318,354,"MediaPlayer.MediaPlayer.1","",Office::msoFalse, "", 0, "", Office::msoTrue);
				 //得到Shape的格式化对象
			 MSPPT::OLEFormatPtr 	 lpOLEFormat=lpShape->GetOLEFormat();
 //从COLEFormat中得到IDispatch*接口,以备调用Forms.HTML:image控件的IDispatch接口,设置该控件的图片来源Source属性
						 IDispatch*  pDisp=lpOLEFormat->GetObject();

         
						 //查询MediaPlayer控件的FileName属性的 DISPID值
         
						 DISPID      dispID;
						 OLECHAR    *szSource = L"FileName";

						 pDisp->GetIDsOfNames(IID_NULL, &szSource, 1,
							LOCALE_USER_DEFAULT, &dispID);
         
						 DISPPARAMS dispParams = { NULL, NULL, 0, 0 };
						 DISPID dispidNamed = DISPID_PROPERTYPUT;
						 CComVariant vrURL(getResPath(url));  

						 dispParams.cArgs = 1;
						 dispParams.rgvarg = &vrURL;
						 dispParams.cNamedArgs = 1;
						 dispParams.rgdispidNamedArgs = &dispidNamed;
                         //通过IDispatch的Invoke函数设置FileName属性为资源的真实路径
						 pDisp->Invoke(dispID, IID_NULL, LOCALE_SYSTEM_DEFAULT,
							DISPATCH_PROPERTYPUT | DISPATCH_METHOD, &dispParams,
							NULL, NULL, NULL);
						 pDisp->Release();

			  }
			  //为flash时,插入ShockwaveFlash.ShockwaveFlash对象,以显示flash资源
		  if (resType== "swf"){
	  
   	 MSPPT::ShapePtr lpShape=lpShapes->AddOLEObject(162,114, 318,354,"ShockwaveFlash.ShockwaveFlash","",Office::msoFalse, "", 0, "", Office::msoTrue);
			       //得到Shape的格式化对象
			 MSPPT::OLEFormatPtr 	 lpOLEFormat=lpShape->GetOLEFormat();
 //从COLEFormat中得到IDispatch*接口,以备调用Forms.HTML:image控件的IDispatch接口,设置该控件的图片来源Source属性
						 IDispatch*  pDisp=lpOLEFormat->GetObject();

         
					
                         //查询flash控件的Movie属性的 DISPID值
						 DISPID      dispID;
						 OLECHAR    *szSource = L"Movie";

						 pDisp->GetIDsOfNames(IID_NULL, &szSource, 1,
							LOCALE_USER_DEFAULT, &dispID);
         
						 DISPPARAMS dispParams = { NULL, NULL, 0, 0 };
						 DISPID dispidNamed = DISPID_PROPERTYPUT;
						 //得到资源的真实路径
						 CComVariant vrURL(getResPath(url));  
                          
						 dispParams.cArgs = 1;
						 dispParams.rgvarg = &vrURL;
						 dispParams.cNamedArgs = 1;
						 dispParams.rgdispidNamedArgs = &dispidNamed;
                         //通过IDispatch的Invoke函数设置Movie属性为资源的真实路径
						 pDisp->Invoke(dispID, IID_NULL, LOCALE_SYSTEM_DEFAULT,
							DISPATCH_PROPERTYPUT | DISPATCH_METHOD, &dispParams,
							NULL, NULL, NULL);
						 pDisp->Release();
		}

         return true;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -