📄 officectrl.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 + -