C# 在多椭圆上创建多个标签
我有6个椭圆和6个标签。我想在C# 在多椭圆上创建多个标签,c#,label,controls,ellipse,C#,Label,Controls,Ellipse,我有6个椭圆和6个标签。我想在椭圆上添加标签s。标签s中的2个正常,但其他的不正常 在调试模式下没有错误 代码如下: private void Form1_Paint(object sender, PaintEventArgs e) { int locY = 200, locX = 10, i = 0; for (int k = 0; k < 3; k++) { locX
椭圆上添加标签
s。标签
s中的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;
}
}
private void Form1\u Paint(对象发送方,PaintEventArgs e)
{
int-locY=200,locX=10,i=0;
对于(int k=0;k<3;k++)
{
locX+=40;
对于(int j=0;j<2;j++)
{
locY+=30;
钢笔=新钢笔(颜色:红色,10);
e、 图形学.抽屉(钢笔,新矩形(locX,locY,10,10));
标签=新标签();
label.Text=i.ToString();
标签位置=新点(locX、locY);
label.BackColor=Color.Transparent;
控件。添加(标签);
i++;
}
locY=200;
}
}
以下是输出:
您还应该在循环外部创建该笔,并确保将其丢弃 下面是一个使用DrawString()的示例,如注释中所述:
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;
}
}
}
private void Form1\u Paint(对象发送方,PaintEventArgs e)
{
StringFormat sf=新的StringFormat();
sf.Alignment=StringAlignment.Center;
sf.LineAlignment=StringAlignment.Center;
int-locY=200,locX=10,i=0;
使用(钢笔=新钢笔(颜色:红色,10))
{
对于(int k=0;k<3;k++)
{
locX+=40;
对于(int j=0;j<2;j++)
{
locY+=30;
矩形rc=新矩形(locX,locY,10,10);
e、 图形学.抽屉(钢笔,rc);
SizeF szF=e.Graphics.MeasureString(即ToString(),this.Font);
矩形rc2=新矩形(新点(rc.Left+rc.Width/2,rc.Top+rc.Height/2),新尺寸(1,1));
rc2.充气((内部)szF.宽度,(内部)szF.高度);
e、 Graphics.DrawString(i.ToString(),this.Font,brush.Black,rc2,sf);
i++;
}
locY=200;
}
}
}
您还应该在循环外部创建该笔,并确保将其丢弃
下面是一个使用DrawString()的示例,如注释中所述:
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;
}
}
}
private void Form1\u Paint(对象发送方,PaintEventArgs e)
{
StringFormat sf=新的StringFormat();
sf.Alignment=StringAlignment.Center;
sf.LineAlignment=StringAlignment.Center;
int-locY=200,locX=10,i=0;
使用(钢笔=新钢笔(颜色:红色,10))
{
对于(int k=0;k<3;k++)
{
locX+=40;
对于(int j=0;j<2;j++)
{
locY+=30;
矩形rc=新矩形(locX,locY,10,10);
e、 图形学.抽屉(钢笔,rc);
SizeF szF=e.Graphics.MeasureString(即ToString(),this.Font);
矩形rc2=新矩形(新点(rc.Left+rc.Width/2,rc.Top+rc.Height/2),新尺寸(1,1));
rc2.充气((内部)szF.宽度,(内部)szF.高度);
e、 Graphics.DrawString(i.ToString(),this.Font,brush.Black,rc2,sf);
i++;
}
locY=200;
}
}
}
1)确实不应该在绘制事件中创建任何控件,尤其是因为您无法控制何时以及多久调用一次。2) 当你可以简单地将文本拉长时,为什么要使用标签呢?所以你说我需要将这些标签创建到Form1\u Load
事件中,对吗?这是一个例子,我想创建一个标签,表示用户需要多少。同意@TaW。每次绘制屏幕时,您将创建6个标签,其生存期绑定到最内层的for
循环。当这些循环中的每一个循环完成时,您刚刚创建的标签将有资格进行垃圾收集(记住,垃圾收集在发布代码中的行为与在调试代码中的行为不同)。你永远不会处理它们,所以你的进程句柄数会一直增加。创建它们的时间并不重要,但你需要确保只创建一次。你的代码无法控制它!如果它们已经存在,您可以将其放入if块中进行测试。。提示:将这一行添加到绘制代码的末尾:Console.WriteLine(this.Controls.Count+“Controls至今”)代码>但是,您可以只绘制文本,大致与绘制椭圆的方式相同。跟踪要在每个圆中绘制的内容,绘制时,绘制椭圆,然后在顶部绘制文本1)您确实不应该在绘制事件内创建任何控件,尤其是因为您无法控制何时以及多久调用一次。2) 当你可以简单地将文本拉长时,为什么要使用标签呢?所以你说我需要将这些标签创建到Form1\u Load
事件中,对吗?这是一个例子,我想创建一个标签,表示用户需要多少。同意@TaW。每次绘制屏幕时,您将创建6个标签,其生存期绑定到最内层的for
循环。当这些循环中的每一个循环完成时,您刚刚创建的标签将有资格进行垃圾收集(记住,垃圾收集在发布代码中的行为与在调试代码中的行为不同)。你永远不会处理它们,所以你的进程句柄数会一直增加。创建它们的时间并不重要,但你需要确保只创建一次。你的代码无法控制它!如果它们已经存在,您可以将其放入if块中进行测试。。提示:将这一行添加到绘制代码的末尾:Console.WriteLine(this.Controls.Count+“Controls至今”)代码>但是,您可以只绘制文本,大致与绘制椭圆的方式相同。跟踪每个圆中要绘制的内容,在绘制时,绘制椭圆,然后绘制文本