Frage

Wie kann ich die geschützte DoubleBuffered Eigenschaft der Steuerelemente in einem Formular, das von Flimmern leiden?

War es hilfreich?

Lösung

Hier ist eine generische Version von Dummy-Lösung .

Wir Reflexion können auf dem geschützten zahlen Steuern und nicht double-Buffering verwenden, wenn der Benutzer in läuft eine Terminal-Services-Session (zB Remote Desktop) Diese Hilfsmethode nicht auf doppelte Pufferung drehen wird, wenn die Person in Remote-Desktop ausgeführt wird.

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); 
}

Andere Tipps

Überprüfen Sie dieses Themas

Durch Wiederholen des Kern dieser Antwort können Sie auf der WS_EX_COMPOSITED Stil Flagge schalten Sie das Fenster sowohl die Form und alle seine Kontrollen doppelt gepuffert zu bekommen. Der Stil Flagge ist seit XP verfügbar. Dabei spielt es keine Malerei schneller machen, sondern das gesamte Fenster in einem Off-Screen-Puffer gezeichnet und Blitted in einem Gleichgewicht geraten auf den Bildschirm. So dass es zu den Augen des Benutzers ohne sichtbare Artefakte Malerei Augenblick aussehen. Es ist nicht ganz problemlos, einige visuelle Stile Renderer auf es Glitch, besonders TabControl, wenn es zu viele Tabs hat. YMMV.

Fügen Sie diesen Code in das Formular-Klasse:

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

Der große Unterschied zwischen dieser Technik und Double-Buffering Unterstützung des Winform ist, dass nur Winform-Version auf einer Steuerung zu zurzeit arbeitet. Sie werden nach wie vor jede einzelne Kontrolle sehen sich malen. Die ebenso wie ein Flackern Effekt aussehen kann, insbesondere wenn das unlackierte Steuer Rechteck schlecht mit dem Fenster des Hintergrund kontrastiert.

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 hat einige weitere Informationen über die Verwendung dieses auf einem Terminalserver.

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

Eine Möglichkeit ist die gezielte Steuerung Sie Puffer verdoppeln wollen erweitern und die Eigenschaft DoubleBuffered innerhalb der Ctor Kontrolle eingestellt.

Zum Beispiel:

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

nobugz erhält der Kredit für das Verfahren in seiner Verbindung, ich bin gerade reposting. Fügen Sie diese Überschreibung der Form:

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

Das funktionierte gut für mich, auf Windows 7 Ich war immer große schwarze Blöcke erscheinen, wenn ich eine Steuer schwere Form ändern. Die Steuerung jetzt hüpfen statt! Aber es ist besser.

Erweiterungsmethode Doppelpufferung aktivieren oder deaktivieren für Steuerelemente

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);
    }
}

Verwendung (zum Beispiel, wie man Datagridview DoubleBuffered):

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

Bevor Sie doppelte Pufferung versuchen, festzustellen, ob SuspendLayout () / ResumeLayout () Ihr Problem lösen.

Das verursachte mir ein Los die Trauer für zwei Tage mit einer dritten Partei Kontrolle, bis ich es aufgespürt.

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

Vor kurzem habe ich eine Menge Löcher (Kot), wenn wieder Sizing / Nachziehen eine Steuer mehrere andere Steuerelemente enthält.

Ich habe versucht, WS_EX_COMPOSITED und WM_SETREDRAW aber nichts funktionierte, bis ich benutzen:

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

Ich wollte nur weiter geben.

vb.net-Version dieser feinen Lösung ....:

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

Sie können auch die Bedienelemente in der eigenen Klassen erben, und legen Sie die Eigenschaft drin. Diese Methode ist auch schön, wenn Sie neigen dazu, eine Menge eingestellt zu tun bis das ist das gleiche auf alle Steuerelemente.

ich gefunden habe, dass einfach Einstellung der DoubleBuffered automatisch auf dem Formular Einstellung setzt alle Eigenschaften hier aufgeführt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top