【问题标题】:Panel is flickering when switching from one winform to another从一种 Winform 切换到另一种 Winform 时面板闪烁
【发布时间】:2013-11-18 20:38:59
【问题描述】:

我在面板上渲染我的图像。

using Microsoft.DirectX.Direct3D;

Device device;

this.device = new Device(0, DeviceType.Hardware, this.panel2,
                CreateFlags.HardwareVertexProcessing, presentationParameters);

因此,当我尝试将 winform 从一个切换到另一个时,面板会闪烁。

我知道很难描述这个场景。因此,我特此将视频剪辑 (.swf) 上传到我的 google 驱动器,你们可以下载并使用窗口媒体播放器打开它来观看视频。

以下是共享链接: https://drive.google.com/file/d/0B6wTfkJvzke_aVJwanVkaU1iSVU/edit?usp=sharing

在视频中,我在调试模式下运行我的应用程序,然后单击任务栏中的“chrome 浏览器”选项卡以访问“chrome 浏览器”,当最小化的“chrome 浏览器”弹出时,面板将闪烁。然后当我再次最小化“chrome浏览器”时,面板再次闪烁。

当屏幕上的面板上方放置了一些其他 winform 时,会出现此问题。

对上述问题有何评论?需要帮助。

【问题讨论】:

    标签: c# winforms panel flicker doublebuffered


    【解决方案1】:

    在将 DirectX 与 Panel 一起使用时,我遇到了同样的闪烁问题。事实证明,操作系统绘制事件正在与我自己发生冲突。要解决此问题,您需要通过创建自定义面板来禁用Panel 上的操作系统绘图。像这样简单的事情就足够了。

    class Direct3DPanel : Panel
    {
        public Direct3DPanel()
        {
            this.SetStyle(ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint | ControlStyles.Opaque, true);
        }
    }
    

    SetStyle 方法调用告诉操作系统只有你应该在Direct3DPanel 中绘图。请注意,一旦您这样做,您将负责所有绘图。您可能需要处理Paint 事件并根据您当前的架构调用您的绘制逻辑。

    您可以在此处获取有关不同ControlStyles 的更多信息 http://msdn.microsoft.com/en-us/library/system.windows.forms.controlstyles(v=vs.110).aspx

    【讨论】:

    • 我确实创建了一个自定义面板控件,但我只将 OptimizedDoubleBuffer、UserPaint、AllPaintingInWmPaint 设置为 true。闪烁问题也可以通过将 Opaque 设置为 true 来解决。非常感谢。
    猜你喜欢
    • 2012-04-14
    • 2014-04-24
    • 2012-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-01
    相关资源
    最近更新 更多