您的位置:首页 > 其它

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。

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 windows PPT