c# - 从一个 winform 切换到另一个时面板闪烁

标签 c# winforms panel flicker doublebuffered

我在面板上渲染图像。

using Microsoft.DirectX.Direct3D;

Device device;

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

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

我知道很难描述这个场景。因此我特此上传了一段视频(.swf)到我的google drive,大家可以下载下来用window media player打开观看。

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

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

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

对上述事项有何评论?需要帮助。

最佳答案

我在将 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

关于c# - 从一个 winform 切换到另一个时面板闪烁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19831908/

相关文章:

c# - 无法加载文件或程序集 'EntityFramework' 或其依赖项之一

wpf - 自定义 UIElement 是否可以实现 IList<UIElement> 并直接分配子项(在 XAML 中)?

C# 数据表 LINQ 和 GROUP BY

c# - 两个 View 模型之间的通信

c# - 如何更改winform中文本框的只读属性false?

c# - 禁用 DataGridView 中的自动添加行

css - 设置 p :panel 的背景图像

java - primefaces ajax 从另一种形式更新面板

c# - 在初始化 ViewModel 时防止执行 ValueChanged

c# - 如何在 Xamarin.iOS 中实现 +(Class) layerClass?