VS下 MFC通过COM操作PPT
2017-02-28 15:30
1591 查看
需要整合一些PPT、Word、PDF进软件,由于PPT有切换动画、音效等难以转化的功能,所以需要将它整体嵌入进来。所以只能用微软的库,以下DLL可以实现播放、跳转页、关闭、获得页码等功能。
Step 1:
在VS2013下,可以新建MFC应用程序或者MFC DLL,因为PPT组件只支持MFC。
Step 2:
我选择新建了DLL。在程序中添加类。
选择相应的类库。
你在选择的时候会发现,原来我们可以利用MFC操作这么多Windows的程序。这里我选择PowerPoint(当然你要先安装它)。在左边的接口里,选择你需要的接口,这里我选择_Application(用来启动PPT),_Presentation(用来获取PPT的实例),Slides(用来设置PPT的播放页面),SlideShowWindows/SlideShowWindow(用来设置播放窗口的大小、位置),SlideShowView(用来具体操作PPT的每个播放页面),如果你需要其他的功能就导入其他的类。导入完成后,我们在程序里,就可以看到这些类的头文件了,实例化后,就可以调用他们的方法,参考下面的代码(加了部分注释)。
Step 3:
Code。
Step 4:
附录,翻译了一些MSDN上我用到的相关类和方法。
SlideShowWindows
Set of SlideShowWindow
Application :返回表示指定对象的创建者的Application对象。
Count:返回集合中的对象数,也就是有多少个window。
Parent:返回其父对象。
SlideShowView
get_EndingSlide:
不知道有啥用,返回值一直是1
GotoSlide(x,y):
可以跳转到任意页
Next:
跳转到下一页
Last:
跳转到上一次访问的页面(因为你可能是跳转过去)
Previous:跳转到上一页
First:从第一页开始显示,和GotoSlide(1,0)效果一致
Exit:这个退出并不能完全把打开PPT所用的相关类都退出,还是要一个一个释放,只能退出当前的Slide,所以没什么用。
DrawLine:设置起始坐标和终止坐标,只能画直线
GetClickIndex,GetClickCount:试了一下一直返回0,讲道理应该是返回上一次鼠标点击的页码/点击次数的,不知道错误原因。
EraseDrawing:清空所有之前画的线
SlideShowWindow:
Activate:激活窗体
GetActive:获取激活状态
Get_Application:返回LPDISPATCH类型的接口指针
Get_Hwnd:并不是获取句柄,返回值是个long,像是判断获取是否成功,没啥用,MSDN上都没有这个方法,我是在VS2013里.出来的
Get_Height:获取高度
Get_Width:获取宽度
Get_Left:获取界面左上角离Screen左侧的间距
Get_Top:
获取界面左上角离Screen上方的间距
Get_IsFullScreen:是否全屏
Get_View:
获取SlideShowView
Get_Parent:获取SlideShowWindows
Put_Height:设置窗口高度
Put_Width:设置窗口宽度
Put_Left:设置窗口左上角离屏幕左侧的间距
Put_Top:设置窗口左上角离屏幕上方的间距
ReleaseDispatch:释放
Slides:
Get_count:
获取PPT总的页数
Slide:
Get_SlideIndex:获取当前Slide的页码
SlideShow:
Put_ShowType(x): x为0,2,>3时都是带框放映,其中2的时候有ScrollBar;3的时候无法点击;1是比较正常的状态,全屏播放,无边框
Put_AdvanceMode(x):x为3的时候,会有录制播放的功能,其他都基本一样
CApplication:
CreateDispatch:创建可自动化的对象,例如Word、Excel、PPT。
有其他问题,欢迎留言。
Step 1:
在VS2013下,可以新建MFC应用程序或者MFC DLL,因为PPT组件只支持MFC。
Step 2:
我选择新建了DLL。在程序中添加类。
选择相应的类库。
你在选择的时候会发现,原来我们可以利用MFC操作这么多Windows的程序。这里我选择PowerPoint(当然你要先安装它)。在左边的接口里,选择你需要的接口,这里我选择_Application(用来启动PPT),_Presentation(用来获取PPT的实例),Slides(用来设置PPT的播放页面),SlideShowWindows/SlideShowWindow(用来设置播放窗口的大小、位置),SlideShowView(用来具体操作PPT的每个播放页面),如果你需要其他的功能就导入其他的类。导入完成后,我们在程序里,就可以看到这些类的头文件了,实例化后,就可以调用他们的方法,参考下面的代码(加了部分注释)。
Step 3:
Code。
extern "C" BOOL __declspec(dllexport) openPpt(LPCTSTR m_szFileName) { AFX_MANAGE_STATE(AfxGetStaticModuleState()); try { if (!m_PPTApp.CreateDispatch(_T("Powerpoint.Application"), NULL)) { //MessageBox(_T("创建PowerPoint应用程序失败!"), AfxGetApp()->m_pszAppName, MB_ICONERROR); return false; } if (!m_PPTApp.m_lpDispatch) { //MessageBox(_T("PPT application was not initialized."), AfxGetApp()->m_pszAppName, MB_ICONERROR); return false; } m_Presentations.AttachDispatch(m_PPTApp.get_Presentations()); m_Presentation.AttachDispatch(m_Presentations.Open(m_szFileName, TRUE, -1, 0)); m_slides = m_Presentation.get_Slides(); m_slide = m_slides.Item(COleVariant((long)1)); m_slideshow = m_Presentation.get_SlideShowSettings(); m_slideshow.put_AdvanceMode(2); m_slideshow.put_ShowType(1); numOfPages = m_slides.get_Count();//获取总页数 m_slideshow.put_LoopUntilStopped(TRUE); //设置循环放映 m_oShowWindow = m_slideshow.Run(); //运行ppt // HRESULT hwnd = m_oShowWindow.get_HWND(); // SetWindowPos(hwnd, HWND_TOPMOST, 0, 0, 0, 0, 3); m_slideShowView = m_oShowWindow.get_View();//得到ppt视图 m_oShowWindow.put_Left(0);//设置ppt播放窗口位置和大小 m_oShowWindow.put_Top(0); int x = GetSystemMetrics(SM_CXSCREEN); int y = GetSystemMetrics(SM_CYSCREEN); m_oShowWindow.put_Width(GetSystemMetrics(SM_CXSCREEN) - 460); m_oShowWindow.put_Height(GetSystemMetrics(SM_CYSCREEN) - 460 * 1080 / 1920); m_oShowWindow.Activate(); return true; } catch (...) { m_PPTApp.ReleaseDispatch(); return false; } } extern "C" BOOL __declspec(dllexport) closePpt() { AFX_MANAGE_STATE(AfxGetStaticModuleState()); m_Presentation.Close(); m_Presentation.ReleaseDispatch(); m_Presentations.ReleaseDispatch(); m_slide.ReleaseDispatch(); m_slideshow.ReleaseDispatch(); m_oShowWindow.ReleaseDispatch(); m_slideShowView.ReleaseDispatch(); m_PPTApp.ReleaseDispatch(); return true; } extern "C" BOOL __declspec(dllexport) nextPage() { AFX_MANAGE_STATE(AfxGetStaticModuleState()); if (m_slideShowView)//如果已经超过了最后一页,slideShowView会为空 { m_slide = m_slideShowView.get_Slide(); } else { closePpt(); return true; } int index = m_slide.get_SlideIndex(); if (index >= numOfPages)//最后一页再跳转就关闭,不显示黑色那一页 { closePpt(); return true; } m_oShowWindow = m_Presentation.get_SlideShowWindow(); m_slideShowView = m_oShowWindow.get_View(); m_slideShowView.Next(); return true; } extern "C" BOOL __declspec(dllexport) lastPage() { AFX_MANAGE_STATE(AfxGetStaticModuleState()); m_oShowWindow = m_Presentation.get_SlideShowWindow(); m_slideShowView = m_oShowWindow.get_View(); m_slideShowView.Previous(); return true; } extern "C" BOOL __declspec(dllexport) jumpToPage(int index) { AFX_MANAGE_STATE(AfxGetStaticModuleState()); m_slideShowView.GotoSlide(index, 0); return true; } extern "C" int __declspec(dllexport) getCurrentPageId() //获得当前页的页码 { AFX_MANAGE_STATE(AfxGetStaticModuleState()); if (m_slideShowView)//如果已经超过了最后一页,slideShowView会为空 { m_slide = m_slideShowView.get_Slide(); } int index = m_slide.get_SlideIndex(); return index; } extern "C" int __declspec(dllexport) getTotalPageNum()//获得总页数 { return numOfPages; } // CMFCLibrary2App 构造 CMFCLibrary2App::CMFCLibrary2App() { // TODO: 在此处添加构造代码, // 将所有重要的初始化放置在 InitInstance 中 } CMFCLibrary2App theApp; BOOL CMFCLibrary2App::InitInstance() { CWinApp::InitInstance(); //初始化Com组件 if (!AfxOleInit()) { AfxMessageBox(L"Initialize COM context failed!", 0, 0); return FALSE; } return TRUE; }
Step 4:
附录,翻译了一些MSDN上我用到的相关类和方法。
SlideShowWindows
Set of SlideShowWindow
Application :返回表示指定对象的创建者的Application对象。
Count:返回集合中的对象数,也就是有多少个window。
Parent:返回其父对象。
SlideShowView
get_EndingSlide:
不知道有啥用,返回值一直是1
GotoSlide(x,y):
可以跳转到任意页
Next:
跳转到下一页
Last:
跳转到上一次访问的页面(因为你可能是跳转过去)
Previous:跳转到上一页
First:从第一页开始显示,和GotoSlide(1,0)效果一致
Exit:这个退出并不能完全把打开PPT所用的相关类都退出,还是要一个一个释放,只能退出当前的Slide,所以没什么用。
DrawLine:设置起始坐标和终止坐标,只能画直线
GetClickIndex,GetClickCount:试了一下一直返回0,讲道理应该是返回上一次鼠标点击的页码/点击次数的,不知道错误原因。
EraseDrawing:清空所有之前画的线
SlideShowWindow:
Activate:激活窗体
GetActive:获取激活状态
Get_Application:返回LPDISPATCH类型的接口指针
Get_Hwnd:并不是获取句柄,返回值是个long,像是判断获取是否成功,没啥用,MSDN上都没有这个方法,我是在VS2013里.出来的
Get_Height:获取高度
Get_Width:获取宽度
Get_Left:获取界面左上角离Screen左侧的间距
Get_Top:
获取界面左上角离Screen上方的间距
Get_IsFullScreen:是否全屏
Get_View:
获取SlideShowView
Get_Parent:获取SlideShowWindows
Put_Height:设置窗口高度
Put_Width:设置窗口宽度
Put_Left:设置窗口左上角离屏幕左侧的间距
Put_Top:设置窗口左上角离屏幕上方的间距
ReleaseDispatch:释放
Slides:
Get_count:
获取PPT总的页数
Slide:
Get_SlideIndex:获取当前Slide的页码
SlideShow:
Put_ShowType(x): x为0,2,>3时都是带框放映,其中2的时候有ScrollBar;3的时候无法点击;1是比较正常的状态,全屏播放,无边框
Put_AdvanceMode(x):x为3的时候,会有录制播放的功能,其他都基本一样
CApplication:
CreateDispatch:创建可自动化的对象,例如Word、Excel、PPT。
有其他问题,欢迎留言。
相关文章推荐
- MFC通过COM接口实现PPT相关操作
- VS2008环境使用MFC操作读取excel文件(OLE/COM)
- 在VS2010中调用COM Interop DLL操作Excel通过get_Range去获取Range时,会发生Object does not contain a definition for get_Range的错误。其原因和解决方案
- 通过VBA实现重复的PPT编辑操作
- vs2012下mfc程序通过ado方式使用access数据库编译的程序在xp底下无法使用解决方法
- MFC通过COM访问excel出现的几个问题解决方法
- 【ahk】通过COM技术操作word文件
- VS 2005 C#操作 XMLhttp://www.cnblogs.com/cstded/archive/2007/02/16/651685.html
- VS2013 MFC中操作MySQL数据库
- MFC个人笔记--创建属性表,并通过文件操作,保存属性表中用户的选择 的步骤
- MFC个人笔记--创建属性表,并通过文件操作,保存属性表中用户的选择 的步骤
- MFC中使用OLE/COM操作EXCEL的方法
- ATL/MFC/COM操作网页的网址,自己收集的,以备后续查阅
- MFC通过获取菜单句柄,实现菜单的基本操作
- C++通过COM接口操作PPT
- OpenCV 通过 MFC 的 Picture Control 控件操作图像
- MFC通过ADO操作Access数据库
- MFC中 通过对子对话框的操作来更新主对话框
- 以下是网上找到一些关于excel操作的资源可通过链接查看http://www.soaspx.com/dotnet/csharp/csharp_20091125_1762.html
- VS2015/MFC编辑框基本操作