【问题标题】:Create multiple label over the multiple ellipse在多个椭圆上创建多个标签
【发布时间】:2020-09-17 12:48:08
【问题描述】:

我有 6 个ellipse 和 6 个label。我想在ellipse 上添加labels。 labels 中的 2 个可以,但其他的不行。

在调试模式下没有错误。

代码如下:

private void Form1_Paint(object sender, PaintEventArgs e)
        {
            int locY = 200, locX = 10, i = 0;
            for (int k = 0; k < 3; k++)
            {
                locX += 40;
                for (int j = 0; j < 2; j++)
                {
                    locY += 30;
                    Pen pen = new Pen(Color.Red, 10);
                    e.Graphics.DrawEllipse(pen, new Rectangle(locX, locY, 10, 10));
                    Label label = new Label();
                    label.Text = i.ToString();
                    label.Location = new Point(locX,locY);
                    label.BackColor = Color.Transparent;
                    Controls.Add(label);
                    i++;
                }
                locY = 200;
            }
        }

这是输出:

【问题讨论】:

  • 1) 你真的不应该在 Paint 事件中创建任何控件,尤其是。因为您无法控制何时以及多久调用一次。 2)当你可以简单地画出文本时为什么要使用标签?
  • 所以你说我需要在Form1_Load 事件中创建这些标签,对吧?这是一个例子,我想创建用户想要多少的标签。
  • 同意@TaW。每次绘制屏幕时,您将创建 6 个标签,它们的生命周期绑定到最里面的 for 循环。随着每个循环的完成,您刚刚创建的标签将有资格进行垃圾收集(请记住,在发布代码中的行为与在调试代码中的行为不同)。您永远不会处理它们,因此您的进程句柄数会不断增加。
  • 何时创建它们并不重要,但您需要确保只创建一次。您的代码无法控制它!您可以将其放入 if 块中,以测试它们是否已经存在。提示:将此行添加到您的绘制代码的末尾:Console.WriteLine(this.Controls.Count + " controls so far.");
  • 但是,您可以只绘制文本,大致与绘制椭圆的方式相同。跟踪你想在每个圆圈中画什么,当油漆到来时,画椭圆,然后在上面画文字

标签: c# label controls ellipse


【解决方案1】:

您还应该在循环之外创建该笔并确保将其丢弃。

这是一个使用DrawString() 的示例,如cmets 中所述:

private void Form1_Paint(object sender, PaintEventArgs e)
{
    StringFormat sf = new StringFormat();
    sf.Alignment = StringAlignment.Center;
    sf.LineAlignment = StringAlignment.Center;

    int locY = 200, locX = 10, i = 0;
    using (Pen pen = new Pen(Color.Red, 10))
    {               
        for (int k = 0; k < 3; k++)
        {
            locX += 40;
            for (int j = 0; j < 2; j++)
            {
                locY += 30;
                Rectangle rc = new Rectangle(locX, locY, 10, 10);
                e.Graphics.DrawEllipse(pen, rc);

                SizeF szF = e.Graphics.MeasureString(i.ToString(), this.Font);
                Rectangle rc2 = new Rectangle(new Point(rc.Left + rc.Width / 2, rc.Top + rc.Height / 2), new Size(1, 1));
                rc2.Inflate((int)szF.Width, (int)szF.Height);
                e.Graphics.DrawString(i.ToString(), this.Font, Brushes.Black, rc2, sf);

                i++;
            }
            locY = 200;
        }
    }
}

【讨论】:

  • 请注意,使用标签可能有其优点,例如它们是可点击的。另外:如果只使用 Brushes.color 或 Pens.color 使用简单的颜色,我们可以省去处理/使用..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多