自定义Powerpoint幻灯片

时间:2011-05-17 13:39:44

标签: c# winapi powerpoint fadein

我只与C#合作了几个星期而且我遇到了一个线程问题。

我一直在构建一个自定义幻灯片,它实现了一个由独立类处理的winform中托管的.ppt演示文稿。幻灯片显示与另一个显示车间动态数据的程序关闭。第二个程序需要发送一个命令进入全屏模式,因为我无法访问它的源代码。

使用Setforegroundwindow API我可以轻松地在两个应用程序之间切换,并通过COM接口控制电源点,但过渡是不稳定的,屏幕调整大小。我希望覆盖一个空白的黑色winform,在这种转换发生时淡入淡出。到目前为止,我没有成功地顺利完成这项工作,我尝试运行淡入淡出的表单并在单独的线程上进行转换,但我还没有弄明白。如果有人对如何做到这一点有任何建议,我将不胜感激。

谢谢。

2 个答案:

答案 0 :(得分:0)

一想法......

有两个ppt装载机。

您正在加载的当前一个和新一个。

保持当前可见且有效,直到新的准备就绪。然后,一旦新的准备好,请隐藏当前的一个。这应该会给你一个很好的过渡。

由于将有两个观看者处于活动状态,因此资源密集程度会更高,但切换应该更加顺畅。

可能希望区分加载与开始。这样你就可以加载到scenese后面,一旦加载,显示并启动ppt。

答案 1 :(得分:0)

在完成一些示例代码之后,我实现了一个后台工作程序。有关详细信息From msdn - How to: Use a Background Worker

我正在尝试找到一种更可靠的方法来确保应用程序处理F11命令,但是现在我在SendKeys之前放入了Thread.Sleep。

请随时留下评论或问题。

[DllImport("user32.dll")]
    [return: MarshalAs(UnmanagedType.Bool)]
    static extern bool SetForegroundWindow(IntPtr hWnd);

    Process p;
    //Process p is initialized: p = Process.Start(@"<path\application.exe>");
    Form2 oForm;

 private void transition()
    {
        BackgroundWorker bw = new BackgroundWorker();
        oForm = new Form2();

        bw.DoWork += new DoWorkEventHandler(bw_DoWork);
        bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
        oForm.Show();
        if (bw.IsBusy != true)
        {
            bw.RunWorkerAsync();
        }

    }
    private void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {       
        oForm.closethis();
    }
    private void bw_DoWork(object sender, DoWorkEventArgs e)
    {
        BackgroundWorker worker = sender as BackgroundWorker;

            if ((worker.CancellationPending == true))
            {
                e.Cancel = true;                   
            }
            else
            {                   
                SetForegroundWindow(p.MainWindowHandle);
                p.WaitForInputIdle(3000);
                System.Threading.Thread.Sleep(500);
                SendKeys.SendWait("{F11}");    
                //Sends the application into full screen mode           
            }

    }

表格淡入淡出的代码..

public partial class Form2 : Form
{
    public Form2()
    {
        this.Visible = false;
        this.Opacity = 0;

        InitializeComponent();

        this.TopMost = true; 
        this.Visible = true;

        while (this.Opacity < 1)
        {
           this.Opacity += .05;
           Thread.Sleep(5);
           this.TopMost = true;
        }       
    }
    private void closefade()
    {
        while (this.Opacity > 0)
        {
            this.Opacity -= .05;
            Thread.Sleep(5);
            this.TopMost = true;
        }
        this.Close();
    }

    delegate void CloseBack();
    public void closethis()
    {
        if (this.InvokeRequired)
        {
            CloseBack b = new CloseBack(closethis);
        }
        else
            closefade();
    }
}