我怎么可以设置的保护 DoubleBuffered 财产的控制的一种形式,是从痛苦的闪烁?

有帮助吗?

解决方案

这里有一个更通用的版本 虚拟的解决方案.

我们可以使用反映获得的保护 DoubleBuffered 酒店,然后它可以被设定为 真的.

注意到:你应该 支付你的开发商税收 而不 使用双缓冲,如果用户运行的终端服务的会议 (例如远程桌面)这样的辅助方法将不会打开双缓冲,如果该人是在运行的远程桌面上。

public static void SetDoubleBuffered(System.Windows.Forms.Control c)
{
   //Taxes: Remote Desktop Connection and painting
   //http://blogs.msdn.com/oldnewthing/archive/2006/01/03/508694.aspx
   if (System.Windows.Forms.SystemInformation.TerminalServerSession)
      return;

   System.Reflection.PropertyInfo aProp = 
         typeof(System.Windows.Forms.Control).GetProperty(
               "DoubleBuffered", 
               System.Reflection.BindingFlags.NonPublic | 
               System.Reflection.BindingFlags.Instance);

   aProp.SetValue(c, true, null); 
}

其他提示

检查 这个线程

重复核心的这个问题的答案,你可以打开WS_EX_COMPOSITED式标志在窗口获得的形式和所有其控制的双缓冲。风格的标志是自XP。它不让画得更快,但整个窗口是绘制一个关屏幕上的缓冲区和混合到屏幕中的一个重击。使它看起来即时向用户的眼睛没有可见的画文物。它不是全部的麻烦-免费的,一些视觉上的风格呈示器可以干扰,特别是卡当其具有太多的标签。情况因人而异。

这段代码进入你的形式等级:

protected override CreateParams CreateParams {
    get {
        var cp = base.CreateParams;
        cp.ExStyle |= 0x02000000;    // Turn on WS_EX_COMPOSITED
        return cp;
    } 
}

大差异之间的这种技术和Winform的双缓冲支持,Winform的版本仅适用于一个控制时间。你仍然会看到每个人的控制油漆的本身。这可能看起来像个闪烁效应,尤其是如果没有漆控制的矩形形成对比重有窗户的背景。

System.Reflection.PropertyInfo aProp = typeof(System.Windows.Forms.Control)
    .GetProperty("DoubleBuffered", System.Reflection.BindingFlags.NonPublic |
    System.Reflection.BindingFlags.Instance);
aProp.SetValue(ListView1, true, null);

Ian 有一些更多的信息,使用这一终端服务器。

public void EnableDoubleBuffering()
{
   this.SetStyle(ControlStyles.DoubleBuffer | 
      ControlStyles.UserPaint | 
      ControlStyles.AllPaintingInWmPaint,
      true);
   this.UpdateStyles();
}

一种方式是扩大特定的控制你想要双缓冲器和设置DoubleBuffered财产内部控制的构造函数.

例如:

class Foo : Panel
{
    public Foo() { DoubleBuffered = true; }
}

nobugz 获取信贷的方法,在他的链接,我只是重新发布.添加这种复盖的形式:

protected override CreateParams CreateParams
{
    get
    {
        CreateParams cp = base.CreateParams;
        cp.ExStyle |= 0x02000000;
        return cp;
    }
}

这个工作最好对我来说,在Windows7我是越来越大的黑块出现的时候我调整一个控制重形式。控制现反弹,而不是!但它是更好的。

扩展的方法 把双缓冲或关闭用于控制

public static class ControlExtentions
{
    /// <summary>
    /// Turn on or off control double buffering (Dirty hack!)
    /// </summary>
    /// <param name="control">Control to operate</param>
    /// <param name="setting">true to turn on double buffering</param>
    public static void MakeDoubleBuffered(this Control control, bool setting)
    {
        Type controlType = control.GetType();
        PropertyInfo pi = controlType.GetProperty("DoubleBuffered", BindingFlags.Instance | BindingFlags.NonPublic);
        pi.SetValue(control, setting, null);
    }
}

使用情况(例如如何使条件DoubleBuffered):

DataGridView _grid = new DataGridView();
//  ...
_grid.MakeDoubleBuffered(true);

在尝试的双缓冲,如果SuspendLayout()/ResumeLayout()解决您的问题。

这引起了我一个 很多 悲伤的两天与第三方控制,直到我跟踪它记下来。

protected override CreateParams CreateParams
{
    get
    {
        CreateParams cp = base.CreateParams;
        cp.ExStyle |= 0x02000000;
        return cp;
    }
}

我最近有很多孔(粪便)时重新调整/重新划定一个控制含有其他几个控制。

我试图WS_EX_COMPOSITED和WM_SETREDRAW但没有工作,直到我用这个:

private void myPanel_SizeChanged(object sender, EventArgs e)
{
     Application.DoEvents();
}

只是想通过它。

vb.net 版本的细的解决方案。...:

Protected Overrides ReadOnly Property CreateParams() As CreateParams
    Get
        Dim cp As CreateParams = MyBase.CreateParams
        cp.ExStyle = cp.ExStyle Or &H2000000
        Return cp
    End Get
End Property

你还可以继承的控制进入自己的课程,并设定的酒店在那里。这种方法也很好,如果你倾向于做了很多的设置是相同的控制。

我们发现,只需设置DoubleBuffered设定上的形式自动设定所有属性,在此列出。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top