2009-08-25 13 views
3

Ich habe einige seltsame Zeichnungsartefakte, von denen ich hoffe, dass mir jemand helfen könnte, sie festzunageln.Manuelle Malerei Ausgabe

Grundsätzlich habe ich ein linkes angedocktes Panel, das einen Gradientenhintergrund haben soll, der nicht richtig funktioniert hat. Ich habe die Farben geändert für das Debuggen von

screenshot http://img509.imageshack.us/img509/5650/18740614.png

Das Panel links dockt ist, und hat eine transparente Kontrolle über sie (daher können Sie kleine Stummel von roten entlang der Kanten sehen, wo die transparente Steuerung richtig gemalt wurde , die Hintergrundfarbe aufnehmend).

Wenn ich die Größe des Panels langsam ändere, bekomme ich rote Linien am unteren Rand, von denen ich erwartet hätte, dass sie von gelben Füllungen bedeckt wären. Der Code, den ich verwende, ist wie folgt:

// Construction 
sidePanel.Paint += new PaintEventHandler(OnPaint); 

private void OnPaint(object sender, System.Windows.Forms.PaintEventArgs e) 
{ 
    Panel pb = sender as Panel; 
    PaintControl(pb.Width, pb.Height, sender, e, true); 
} 

private static void PaintControl(int width, int height, object sender, PaintEventArgs e, bool sidebar) 
{ 
    Rectangle baseRectangle = new Rectangle(0, 0, width -1, height-1); 

    using (LinearGradientBrush gradientBrush = new LinearGradientBrush(baseRectangle, WizardBaseForm.StartColour, WizardBaseForm.EndColour, 90)) 
    { 
     e.Graphics.Clear(Color.Yellow); 
     e.Graphics.DrawRectangle(Pens.Red, baseRectangle); 
     e.Graphics.FillRectangle(Brushes.Yellow, baseRectangle); 
    } 
} 

protected override void OnResize(EventArgs e) 
{ 
    base.OnResize(e); 
    this.Invalidate(); 
} 

Der Gesamteffekt dieser ist Ich bin nicht entweder eine schöne feste Farbe oder einen schönen Farbverlauf füllen, wenn ich die Größe zu bekommen.

Antwort

3

würde ich vorschlagen, Ihr eigenes Panel zu schaffen, leiten sie von der Platte und legen Sie die folgenden im Konstruktor:

this.SetStyle(ControlStyles.AllPaintingInWmPaint 
       | ControlStyles.OptimizedDoubleBuffer 
       | ControlStyles.ResizeRedraw 
       | ControlStyles.DoubleBuffer 
       | ControlStyles.UserPaint 
       , true); 
+0

Fair genug. Klappt wunderbar. Ich verstehe immer noch nicht ganz, warum sich das ursprüngliche Problem manifestiert hat. – Ian

+0

Das liegt daran, dass das Paint-Ereignis nicht ausgelöst wird, wenn Sie die Größe ändern. Also musst du es mit dem ResizeRedraw erzwingen, der Rest ist nicht zwingend, aber helfe mit Verbesserungen auf seinen eigenen kleinen Wegen. Das Flackern Ihres Formulars war zuvor, weil Sie den Stil für das Formular festgelegt haben und nicht das Bedienfeld. Es ist eine lustige Welt, die Welt der manuellen Malerei! – ThePower

1

Add New folgenden (nach InitializeComponents):

this.SetStyle(ControlStyles.ResizeRedraw, true); 

Dies ist Malerei auf Resize zu gewährleisten.

Es gibt einige zusätzliche Stile, die Sie versuchen können (AllPaintingInWmPaint, UserPaint ...), aber ob sie eingestellt werden sollten oder nicht, hängt von Ihrem speziellen Fall und was genau Sie tun möchten. Falls alle Bilder von Ihnen in Paint erstellt werden, würde ich sie einstellen.

+0

Josip. Wenn ich das hinzufüge, dann scheint das ganze Formular sehr flockig zu werden, wenn ich anfange Dinge zu verändern ... – Ian

+0

Sie müssen sie nur für das Panel hinzufügen. – ThePower