2010-09-15 9 views
26

Ich habe diese auf meine Form Konstruktor Code:WinForms Double Buffering

this.SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint | ControlStyles.DoubleBuffer, true); 

Aber es zeigt immer noch hässliche Artefakte, wenn es die Steuerelemente lädt, wenn sie geändert werden (die Form und seine Komponenten ändern (müssen Aktualisierung) oft) .

Was muss ich anders machen?

Antwort

53

Dies hat nur Auswirkungen auf das Formular selbst, nicht auf die untergeordneten Steuerelemente. Wenn Sie eine Menge von ihnen haben, dann wird die Zeit, die sie abwechselnd malen müssen, merklich, es hinterlässt ein rechteckiges Loch, wo die Kontrolle geht, die nicht gefüllt wird, bis die Kinderkontrolle es an der Reihe ist.

Was Sie dagegen tun müssten, ist Doppel-Pufferung der gesamten Form und die Steuerelemente. Dies ist eine Option, die seit Windows XP zur Verfügung steht, wodurch das WS_EX_COMPOSITED-Stilflag verfügbar gemacht wurde. Fügen Sie diese in das Formular, um ihn einzuschalten:

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

Es ist nicht das Gemälde beschleunigt überhaupt, aber die Form schnappt auf den Bildschirm nach einer Verzögerung. Beseitigung der sichtbaren Farbartefakte. Um die Verzögerung wirklich zu beheben, müssen keine Steuerelemente verwendet werden. Was würden Sie tun, indem Sie die OnPaint-Methode verwenden, um die "Steuerelemente" zu zeichnen und das OnMouseClick-Ereignis schlau zu machen, auf was "Kontrolle" vom Benutzer geklickt wurde?

+0

WS_EX_COMPOSITED arbeitet nur am klassischen Thema unter Win7/Vista, nicht am Thema Aero. Kennt jemand in diesem Fall die Lösung? – KevinBui

+4

@DKhanh - das funktionierte für mich auf Aero –

+0

Es funktioniert wie ein Charme (nicht eine Bezugnahme auf Windows 8 Charms, aber ich hoffe, es funktioniert auch auf Windows 8, sowie XP, falls erforderlich). –