2011-01-14 7 views
0

Ich zeichne auf Panel in Windows.Forms.
Wenn ich Doppelpufferung wie hier verwende, kann ich nur rechteckigen Bereich zuweisen.Double Buffering nicht-rechteckige Zuordnung

Und wenn ich Kreis oder Ellipse zeichne verbleibende Raum ist mit schwarzer Farbe gefüllt.
Bitte helfen Sie mir herauszufinden, was ich falsch mache oder wie ich mit diesem Problem umgehen kann.
Vielen Dank im Voraus! :)

Ich versuchte this.DoubleBuffered = true zu verhindern, dass Flimmern. Es nützt nichts.

Var p ist Panel, um etwas darauf zu zeichnen.

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void Dr(bool variant) 
    { 
     BufferedGraphicsContext currentContext; 
     BufferedGraphics myBuffer; 
     currentContext = BufferedGraphicsManager.Current; 
     myBuffer = currentContext.Allocate(panel1.CreateGraphics(), panel1.DisplayRectangle); 
     LinearGradientBrush lgb; 
     if (variant) lgb = new LinearGradientBrush(new Point(0, 0), new Point(500, 500), Color.Red, Color.DarkRed); 
     else lgb = new LinearGradientBrush(new Point(0, 0), new Point(500, 500), Color.DarkRed, Color.Red); 
     myBuffer.Graphics.FillEllipse(lgb, 0, 0, 300, 300); 
     myBuffer.Graphics.DrawString("Lorem ipsum", new Font("calibri", 40), Brushes.White, new PointF(50, 50)); 
     myBuffer.Render(); 
    } 

    private void Form1_Paint(object sender, PaintEventArgs e) 
    { 
     Dr(true); 
    } 

    private void panel1_MouseEnter(object sender, EventArgs e) 
    { 
     Dr(false); 
    } 

    private void panel1_MouseLeave(object sender, EventArgs e) 
    { 
     Dr(true); 
    } 
} 

Antwort

2

Ohne zu kommentieren, was Sie versuchen Unrecht zu tun oder was Sie nicht möglicherweise kann hier tun oder kann, wird das Grundproblem nicht flimmern. Doppelpufferung wird nicht helfen. Sie haben es versäumt, einen Teil des Panels zu füllen, das Sie dem Puffer hinzugefügt haben, den Sie nicht gezeichnet haben. Add code wie:

Dies wird füllen die gesamte rect mit der ursprünglichen Rückenfarbe der Platten.

Allerdings wird das Ihr sofortiges Problem beheben, aber es funktioniert immer noch nicht wie Sie wollen. Versuchen Sie, ein Fenster über Ihr Formular zu bewegen. Sobald sich das Panel aus irgendeinem Grund neu streichen muss, ist das, was Sie gezeichnet haben, verschwunden. Um ein Panel mit einer dauerhaften Zeichnung zu erstellen, müssen Sie ein eigenes Steuerelement erstellen, von einem Panel erben und die benutzerdefinierte Zeichnung in der OnPaint-Methode des Steuerelements implementieren.

C# Winforms-Steuerelemente sind nicht wirklich transparent. Wenn Sie also einen transparenten Hintergrund wünschen, müssen Sie ein eigenes Steuerelement erstellen. Die Technik ist hier beschrieben:

http://www.bobpowell.net/transcontrols.htm

+0

Aber wenn das, was ich transparent Backcolor will, weil ich Formularhintergrundbild Muster verwenden? –

+0

siehe oben beschriebene Änderungen – Sisyphus

+0

Vielen Dank. Ich schätze :) –