2016-07-03 11 views
2

Also in meinem Projekt muss ich eine TXT-Datei lesen, die aus "." S und "#" besteht. Diese .txt-Datei ist die Karte für ein Labyrinth. Die # sind unpassierbare Objekte und die.'s sind Gegenstände, die gesammelt werden können.So erstellen Sie ein Grafikobjekt in einem Etikett

Ich habe es bereits geschafft, im Text zu analysieren und eine TableLayoutPanel zu erstellen, die Label Steuerelemente enthält, die die # und.'s enthalten. Ich möchte jedoch die .s durch Kreise ersetzen, die in der Zelle zentriert sind.

Wie mache ich das? Hier ist was ich habe.

public class Import: TableLayoutPanel 
{ 
    public int zeilen, spalten; 
    TableLayoutPanel tlp = new TableLayoutPanel(); 
    public TableLayoutPanel getData(string path) 
    { 
     StreamReader sr; 
     TableLayoutPanel tlp = new TableLayoutPanel(); 
     tlp.Dock = DockStyle.Fill; 
     tlp.CellBorderStyle = 0; 


     if (File.Exists(path)) 
     { 
      try 
      { 
       using (sr = new StreamReader(path)) 
       { 

        spalten = Int32.Parse(sr.ReadLine().Trim()); 
        zeilen = Int32.Parse(sr.ReadLine().Trim()); 


        TableLayoutColumnStyleCollection Columns = tlp.ColumnStyles; 
        TableLayoutRowStyleCollection Rows = tlp.RowStyles; 
        foreach (ColumnStyle Column in Columns) 
         tlp.ColumnStyles.Add((new ColumnStyle(SizeType.Percent, 100.0F/Convert.ToSingle(spalten)))); 
        foreach (RowStyle Row in Rows) 
         tlp.RowStyles.Add((new RowStyle(SizeType.Percent, 100.0F/Convert.ToSingle(zeilen)))); 


        for (int i = 1; i <= zeilen; i++) 
        { 
         string line = sr.ReadLine(); 
         for (int j = 1; j <= spalten; j++) 
         { 
          Label l = new Label(); 
          tlp.Controls.Add(l, j-1, i-1); 

          l.Dock = DockStyle.Fill; 

          l.Text = line.Substring(j-1, 1); 
          l.Name = "l" + i.ToString() + "r" + (j).ToString(); 
          if (line.Substring(j - 1, 1) == "#") 
           l.ForeColor = Color.Green; 

          if (line.Substring(j - 1, 1) == ".") 
          { 
           l.ForeColor = Color.Blue; 
           Graphics g = l.CreateGraphics(); 
           g.DrawEllipse(new Pen(Color.Blue), l.Location.X, l.Location.Y, tlp.Width, tlp.Height); 


          } 


         } 
        } 
        return tlp; 
       } 
      } 
      catch(Exception e) { MessageBox.Show(e.Message); MessageBox.Show(e.StackTrace); return null; } 
     } 
     else 
      return null; 
    } 
+0

Alles wie das sollte in dem Paint-Ereignis getan werden, jedoch empfehle ich Ihnen, eine grafikfreundlichere Umgebung wie WPF anstelle von WinForms zu verwenden – Steve

+0

Leider muss ich Winforms in diesem Fall verwenden (die Aufgabe besagt, dass ich habe zu).Ich habe versucht, ein Grafik-Ereignis zu verwenden, aber ich weiß nicht, wie ich die Speicherorte der spezifischen Zellen von. Hast du eine Idee, wie ich das machen könnte? – coding4life

Antwort

2

Wenn ein Label Erstellen Sie ihre Paint Veranstaltung zusammen mit ihm schaffen, inlined als Lambda:

Label l = new Label(); 
l.Name = "Label #" + (i * zeilen).ToString("00") + ":" + j.ToString("00"); 
l.Text = "ABCE"; 
l.Paint += (ss, ee) => 
{ 
    // do your painting here: 
    using (LinearGradientBrush lgb = 
     new LinearGradientBrush(l.ClientRectangle, Color.Cyan, Color.DarkCyan, 0f)) 
     ee.Graphics.FillRectangle(lgb, l.ClientRectangle); 
    ee.Graphics.DrawString(l.Text, Font, Brushes.Black, 1, 1); 

}; 

Sie können die sender ss werfen zu Label und greifen Sie auf alle seine Eigenschaften zu. Beachten Sie, dass die oben genannten Lambda aufgerufen werden, wann immer die Label lackiert werden muss, das heißt immer wenn Sie es oder einen seiner Container oder ungültig machen, wenn das System es aktualisieren muss.

Es wird dann immer verwenden, um die aktuellen Daten, so dass, wenn Sie den Text später ändern wird es den neuen Text verwenden:

Label oneOfMyLabels = tlp.Controls["Label #03:02"] as Label; // pick or find the right one! 
if (oneOfMyLabels != null) 
{ 
    oneOfMyLabels.Text = "New Text"; 
    oneOfMyLabels.Invalidate(); // optional when change the text of a Label 
} 

Beachten Sie, dass Sie immer zu Speicher benötigen die Daten, dass die Steuerung Malerei außerhalb des Paint Ereignis, entweder auf Klassenebene oder irgendwie an die Kontrolle gebunden.

Bei Änderung der Farben zum Beispiel Sie sie irgendwo gespeichert würden, und diese Werte für die Erstellung der Farbverlauf anstelle von Hartcodierung verwenden sie ..

Jedes Mal, wenn Sie diese Daten, die Sie brauchen ändern Invalidate auf der Label zu nennen. Die Text Änderung wird das für Sie tun, aber andere Daten brauchen Sie, um Re-Malerei auszulösen ..!

Beachten Sie auch, dass Sie da Labels-Dock.Fill gesetzt werden, um die Zellen sie sitzen in Ihnen die Kreise auch dort ziehen:

ee.Graphics.DrawEllipse(Pens.Blue, 0, 0, l.Width - 1, l.Height - 1); 

Natürlich habe ich die LinearGradientBrush nur zum Spaß eingesetzt ..

0

Verwenden Paint-Ereignis aus Ihrer Form:
https://msdn.microsoft.com/en-us/library/system.windows.forms.control.paint(v=vs.110).aspx
Sie alles, was es ziehen kann. Von Rechteck, Kreis, String, etc ....

using System.Drawing; 
using System.Windows.Forms; 

namespace WindowsFormsApplication2 
{ 
    public partial class Form1 : Form 
    { 
    private readonly Pen greenPen = new Pen(Brushes.Green); 
    private readonly Pen redPen = new Pen(Brushes.Red); 
    private readonly Font testFont = new Font(FontFamily.GenericSansSerif, 10f); 

    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void Form1_Paint(object sender, PaintEventArgs e) 
    { 
     e.Graphics.DrawRectangle(redPen, 0f, 0f, 100f, 100f); 
     e.Graphics.DrawEllipse(greenPen, 10f, 10f, 200f, 200f); 
     e.Graphics.DrawString("Hello Graphics", testFont, Brushes.Blue, 30f, 30f); 
    } 
    } 
} 
+0

Ich habe bereits versucht, ein Paint-Event zu verwenden, aber ich weiß nicht, wie ich die Orte meines "." Zellen in meiner Malmethode. – coding4life

+1

Es ist einfacher, ein eigenes UserControl zu erstellen und dort Paint zu verwenden, statt TableLayoutPanel und Label zu verwenden und dann das "." Zu finden. –

Verwandte Themen