如何在标签中创建图形对象

本文关键字:创建 图形 对象 标签 | 更新日期: 2023-09-27 17:54:07

所以在我的项目中,我需要读取一个.txt文件,由"。's和' # 's。这个.txt文件是迷宫的地图。"#"是不可传递的对象,"。"是应该可以收集的项。

我已经设法在文本中进行解析并创建包含Label控件的TableLayoutPanel,其中包含#和.'s。但是,我想用单元格居中的圆圈替换。

我该怎么做?

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;
    }

如何在标签中创建图形对象

当创建Label时,您可以创建它的Paint事件,作为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);
};

您可以将sender ss强制转换为Label并访问其所有属性。注意上面的Lambda将在Label需要绘制时被调用,也就是当你使或它的一个容器无效时,或者当系统需要刷新时,调用

它将始终使用当前数据,因此当您稍后更改文本时,它将使用新文本:

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
}
请注意,您总是需要在Paint事件的之外存储控制绘制的数据,无论是在类级别还是以某种方式绑定到控件。

例如,当你改变颜色时,你可以将它们存储在某个地方,并使用这些值来创建渐变画笔,而不是硬编码它们。

当你改变这些数据时,你需要在Label上调用InvalidateText更改将为您做到这一点,但其他数据需要触发重新绘制…!

还请注意,由于标签被设置为Dock.Fill 单元格它们所在的位置,您也可以在那里画圆圈:

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

当然我插入LinearGradientBrush只是为了好玩…

从窗体中使用Paint事件:
https://msdn.microsoft.com/en-us/library/system.windows.forms.control.paint (v = vs.110) . aspx
你可以把所有的东西都画在那里。从矩形,圆形,字符串等....

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);
    }
  }
}