消除C#WinForms应用程序中的闪烁

时间:2015-11-18 06:39:25

标签: c# forms winforms flicker

我正在使用C# WinForm Application创建Visual Studio 2013(针对触控设备“MS Surface Hub”)。
我创建了两种形式:

  1. 第一个表单包含在表单加载
  2. 上运行的简介视频(axWindowsMediaPlayer)
  3. 第二个表单包含菜单(Flash文件)
  4. 如果用户通过触摸表单1上的屏幕中断,则介绍视频将停止播放并移至表单2.以下是我的代码:

    private void axWindowsMediaPlayer_ClickEvent(object sender, AxWMPLib._WMPOCXEvents_ClickEvent e)
        {
            Player.close();
            var menu = new Menu();
            menu.Closed += (s, args) => this.Close();
            menu.Show();
            this.Hide();
        }
    

    然而,当我检查从表格1到表格2的过渡时,我观察到flicker effect(即我观察到后屏幕显示了几分之一秒)。如何消除这种影响?

    我在Stack Forums上经历了很多问题并且还阅读了很多博客,但没有找到可行的解决方案。我被建议在我的表单中使用DoubleBuffered属性,但它给了我以下错误:

      

    只有赋值,调用,递增,递减,等待和新对象表达式才能用作语句

    另一个建议是使用WS_EX_COMPOSITED 0x02000000L,但我没有找到关于如何在我的代码中准确实现这一点的足够说明。在MSDN上的引用:

      

    使用双缓冲以底部到顶部绘制顺序绘制窗口的所有后代。有关更多信息,请参阅备注。如果窗口具有CS_OWNDC或CS_CLASSDC的类样式,则不能使用此方法。

    我想知道是否有解决闪烁效应的解决方法。

1 个答案:

答案 0 :(得分:1)

通过使用表单的sendToBackbringToFront属性,我实现了零闪烁。我最初在InitializeForm()函数中加载了两个表单,然后在Touch事件上的表单上设置这些属性。通过这样做,可以消除加载表单的时间,即使用.show().hide()

注意:我的表单都是static,因此我可以应用这些属性。在动态决定要加载哪个表单的场景中,我不确定这是否会产生所需的结果。欢迎任何更好的解决方案。