程序内嵌PPT播放及相关控制方法

本文介绍如何在Delphi程序中内嵌PowerPoint播放,并通过API函数隐藏PPT的菜单、工具条等,实现仅显示播放区域的效果。通过移动和调整PowerPoint窗口大小,使其适应面板,只显示PPT播放内容。同时,文章提到了在确定播放区域过程中可能出现的闪烁问题,并提供了源代码示例。
摘要由CSDN通过智能技术生成

作者:原创

方案:

  1. 将PowerPoint程序创建到自己程序的一个面板A中来
  2. 确定PPT播放区以外区域的大小,主要是为移动并隐藏这些不必要的区域做准备
  3. 移动PowerPoint程序主窗口并调整其大小,以便将PowerPoint主窗口的边框,菜单,工具条,滚动条,状态条等不必要的区域隐藏到面板A的可视范围以外
  4. 这样在面板A的范围内就只剩下PPT播放区了,就好像PPT是在自己的程序内容播放一样,如下图所示:


关键:

  1. 将PowerPoint程序放到自己的程序中,使用WINAPI函数:SetParent(p_handle, p_ParentHandle);
  2. 计算播放区以外区域的大小,首先要确定那里是播放区,播放区与其他区域的区别是什么?这里我用的方法是将整个PowerPoint窗口显示在面板A中,然后默认中心点位置的窗口类是播放区,并取出这个窗口类的类名:B,然后沿横竖两个中轴,由四个方向逐像素扫描PowerPoint主窗口,直到找到窗口类B,而这是的位置应该是B的上下左右四个边沿,从而确定播放区与PowerPoint主窗口四个边所距的像素数.其中用到的API函数有:ClientToScreen(p_Handle: hwnd; var p_Point: TPoint),客户区坐标转化为屏幕坐标;
    HWND WindowFromPoint( POINT Point); 取坐标点上窗口的句柄;
    GetClassName(HWND hWnd,LPTSTR lpClassName,int nMaxCount);取句柄指定的类的名称;

 

问题:

PPT播放区的定义过程中需要主程序始终在系统中的最前面,PowerPoint主窗口也要总是显示出来,这样在整个调入过程中会有闪烁的感觉,不太完美,如果能做到像IE内嵌PPT那样就好了.

附录:源代码

unit Unit1;

interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs,
  PowerPointXP, //
  OfficeXP, //
  OleServer, //
  StdCtrls,
  ComCtrls, //
  ShellAPI, //
  TLHelp32, //
  ExtCtrls,
  ActiveX; //

type
  TPPTWinState = record
    State: PpWindowState;
    Width,
      Height,
      Left,
      Top: Single;
  end;

  TClassInfo = record
    Handle: Hwnd;
    ClassName: string;
  end;

  TPlayAreaMargin = record
    Left: integer; //左边框
    Right: integer; //右边框 + 滚动条
    Top: integer; //上边框 + 窗口标题栏 + 菜单 + 工具条
    Bottom: integer; //底边框 + 状态栏
  end;

  TForm1 = class(TForm)
    pptp: TPowerPointPresentation;
    Panel1: TPanel;
    Panel2: TPanel;
    Button5: TButton;
    Button6: TButton;
    Button7: TButton;
    Button8: TButton;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button7Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure Button6Click(Sender: TObject);
    procedure Button8Click(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure Panel1Resize(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }

    FPPTParentWinHandle: HWnd;
    FPPTWinHandle: HWnd;
    PPTA: TPowerPointApplicatio

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值