2016-07-22 8 views
1

Also versuche ich ein neues Formular zu erstellen, ein Rechteck zu zeichnen und dann dieses Rechteck auf dem Formular angezeigt zu bekommen. Ich kann es nicht scheinen lassen. Das Formular zeigt, aber das Rechteck wird nicht gezeichnet.Rechteck erstellen und auf neuem Formular anzeigen

Ich habe dies so weit:

private void btnLayout_Click(object sender, EventArgs e) 
{ 
    Form form = new Form(); 
    form.Text = "Design"; 
    using (Graphics g = form.CreateGraphics()) 
    { 
     Pen pen = new Pen(Color.Black, 2); 
     Brush brush = new SolidBrush(Color.AliceBlue); 
     g.DrawRectangle(pen, 100, 100, 100, 200); 
     pen.Dispose(); 
    } 
    form.Show(); 
} 
+0

Wie groß ist das Formular? Ist es höher als 100px und breiter als 100px? –

+0

Behoben, überprüfen Sie meine Antwort –

Antwort

2

Sie auf dem Formular in Paint Ereignis des Formulars malen sollte, sonst wird Ihre Malerei verschwinden wird, wenn etwas Ihre Form repaint machen, zum Beispiel ein minimieren und Wiederherstellen oder Verschieben eines anderen Fensters über Ihrem Fenster.

Beispiel

private void button1_Click(object sender, EventArgs e) 
{ 
    var f = new Form(); 
    f.Paint += (se, pe) => 
    { 
     var r = new Rectangle(10, 10, 100, 100); 
     pe.Graphics.FillRectangle(Brushes.AliceBlue, r); 
     using (var pen = new Pen(Color.Black, 2)) 
      pe.Graphics.DrawRectangle(pen, r); 
    }; 
    f.Show(); 
} 

Hinweis

  • Sie Brushes.AliceBlue verwenden können, statt new SolidBrush(Color.AliceBlue)
  • Wenn in irgendeinem Grund einen neuen SolidBrush erstellt, vergessen Sie nicht, es zu entsorgen .
  • Erstellen und verwenden Sie Einwegobjekte in einem using Block. Auf diese Weise werden sie automatisch entsorgt, wenn sie am Ende der Verwendung nicht mehr verfügbar sind.
  • Die Aussage f.Paint += (se, pe) =>{/*...*/} entspricht f.Paint += f_Paint; und dann mit einer solchen Methode void f_Paint(object sender, PaintEventArgs e) {/*...*/}.
+0

Hallo, Sie hatten Recht in Ihrem Kommentar. Aber in Bezug auf meinen Code, würde nicht der Pinsel wegen der Tatsache, dass es bereits in einer Verwendung Anweisung ist entsorgt werden? Wohnt es schon nur im using-Block? Obwohl kannst du das f.Paint + = auf andere Weise erklären. Ich bin mir nicht sicher ob ich das verstehe. Fügt das nicht eine neue Malinstanz hinzu? –

+1

'f.Paint + = (se, pe) => {/*...*/}' ist eine Möglichkeit, einen Delegaten einem Event als Event-Handler zuzuordnen. Es ist äquivalent zu 'f.Paint + = f_Paint;' und dann mit einer solchen Methode 'void f_Paint (Objektabsender, PaintEventArgs e) {/*...*/}'. Ein Beispiel finden Sie unter [Lambda-Ausdrücke außerhalb von LINQ verwenden] (https://msdn.microsoft.com/en-us/library/bb383984.aspx). –

+1

Wenn Sie einen using-Block erstellen: 'using (var x = new X()) {/*...*/}' dann wird 'x' garantiert nach Blockende entsorgt. Die Verwendung hat keine Auswirkungen auf andere Objekte im Block. Weitere Informationen finden Sie unter [using statement] (https://msdn.microsoft.com/de-de/library/yh598w02.aspx). –

0

Aus irgendeinem Grund, den ich nicht ein Rechteck auf einem Formular hinzufügen können, die noch nicht gezeigt wurde, aber es funktioniert, wenn Sie den Code setzen, nachdem das Formular angezeigt wurde .

private void btnLayout_Click(object sender, EventArgs e) 
     { 
      Form form = new Form(); 

      form.Text = "Design"; 

      form.Show(); 

      using (Graphics g = form.CreateGraphics()) 
      { 
       Pen pen = new Pen(Color.Black, 2); 
       Brush brush = new SolidBrush(Color.AliceBlue); 

       g.DrawRectangle(pen, 100, 100, 100, 200); 

       pen.Dispose(); 
      } 
} 
+1

Dies ist nicht die richtige Art, ein Rechteck auf Ihrem Formular zu zeichnen. Um das Problem zu sehen, minimieren Sie einfach Ihr Formular und stellen Sie es wieder her und sehen Sie das Ergebnis. Ich habe eine Antwort für Sie mit einigen nützlichen Notizen geschrieben :) –

+0

@RezaAghaei Sie sind richtig, danke –

0

Zeigen Sie das Formular, und zeichnen Sie das Rechteck.

dh: Bewegen Sie den form.Show() Aufruf oben:

using (Graphics g = form.CreateGraphics()) 
Verwandte Themen