个人的电脑环境是Win7 64bit,VS2010,Office2013
打开VS2010,文件>新建>项目,项目名称PPT,
这里选择了“自动化”,这个是很重要的,因为我们现在要开发的就是Office自动化程序,勾选这个选项之后引导程序会在代码中添加相关的初始化代码。点击完成.
删除默认的“确定”,“取消”和静态文本框控件,添加5个按钮,并将Caption和ID修改为下面的内容
界面如下:
准备工作完成。
下面引入操作PPT所需的库。左下角切换到“类视图”,然后项目>添加类
选择TypeLib中的MFC,添加
从注册表中添加类,可用的类型库中选择Microsoft PowerPoint 15.0 Object Library<2.b>,添加下图所示的6个接口,这里只实现PPT的打开,播放,前后翻页等功能,不需要将所有接口都添加进去。
其中左边“接口”和右边“生成的类”的对应关系如下:
_Application | CApplication |
_Presentation | CPresentation |
Presentations | CPresentations |
SlideShowSettings | CSlideShowSettings |
SlideShowView | CSlideShowView |
SlideShowWindow | CSlideShowWindow |
完成之后如下图:
在上面的CPPTDlg上右键>添加>添加变量,添加CApplication类型的变量App,权限为private.此时PPTDlg.h中自动添加
#include "capplication.h"
并且在最后声明了刚才添加的变量
private:
CApplicationApp;
这时按Ctrl+F5运行程序,这时会提示有很多错误,类似下面的:
双击CApplication这个类,将下面的代码注释掉。
#import "C:\\Program Files\\MicrosoftOffice\\Office15\\MSPPT.OLB" no_namespace
然后再Ctrl+F5就没有错误。
同样的方法添加其他5个变量,完成之后PPTDlg.h中应该有如下内容:
private:
CApplicationApp;
CPresentationsPresentations;
CPresentationPresentation;
CSlideShowViewSlideShowView;
CSlideShowWindowSlideShowWindow;
CSlideShowSettingsSlideShowSettings;
注意:
1. 需要将每个类中那句#import注释掉
2.如果添加成员变量不是通过“添加成员变量向导”添加,而是直接在CPPTDlg.h后面输入,这时还需要包含对应类的头文件,即在PPTDlg.h开头写如下代码
#include "capplication.h"
#include "cpresentations.h"
#include "cpresentation.h"
#include "cslideshowview.h"
#include "cslideshowwindow.h"
#include "cslideshowsettings.h"
在PPTDlg的OnInitDialog()的return之前添加下面的初始化语句
if(!App.CreateDispatch("Powerpoint.Application",NULL)){
MessageBox("无法启动PPT");
}
然后就是各个按钮的响应代码,如下:
void CPPTDlg::OnBnClickedOpen()
{
//MessageBox("打开 被按下");
static char BASED_CODE szFilter[] = "PowerPoint Files (*.ppt)|*.ppt||";
CFileDialog FileDlg(TRUE,"PPT",NULL,OFN_FILEMUSTEXIST|OFN_NONETWORKBUTTON
|OFN_PATHMUSTEXIST,szFilter);
FileDlg.DoModal();
CString FileName;
FileName = FileDlg.GetPathName();
if(!FileName.IsEmpty())
{
Presentations = App.get_Presentations();
Presentation = Presentations.OpenOld(FileName,0,0,1);
}
}
void CPPTDlg::OnBnClickedPlay()
{
SlideShowSettings = Presentation.get_SlideShowSettings();
SlideShowSettings.Run();
}
void CPPTDlg::OnBnClickedPre()
{
SlideShowWindow = Presentation.get_SlideShowWindow();
SlideShowView = SlideShowWindow.get_View();
SlideShowView.Previous();
}
void CPPTDlg::OnBnClickedNext()
{
SlideShowWindow = Presentation.get_SlideShowWindow();
SlideShowView = SlideShowWindow.get_View();
SlideShowView.Next();
}
void CPPTDlg::OnBnClickedExit()
{
if(App.m_lpDispatch!=NULL){
App.Quit();
App.ReleaseDispatch();
if (CanExit())
CDialogEx::OnOK();
}
if (CanExit())
CDialogEx::OnOK();
}
注:在退出响应函数中那样写的目的是退出PPT的同时退出应用程序
程序运行时360会拦截,原因未知,个人猜测是由于项目引导程序中选择“自动化”引起的,因为其他程序没有被拦截。
源码下载地址:源码下载