我一直致力于在C#中绘制网格,这很有效!但不知何故,我总是遇到一些DrawGrid方法的问题。我发现每次添加标签时,它都会被重新绘制,并且在添加之后不断地重绘。下面是我的代码:
Rectangle[,] rec = new Rectangle[6,6];
Label label_1 = new Label();
Label label_2 = new Label();
public Reversi()
{
ClientSize = new Size(500,425);
BackColor = Color.DarkGreen;
NewGame();
Paint += DrawGrid;
}
public void NewGame()
{
// here is some more stuff which I will leave out for the sake of clarity
for (int i = 0; i < grspel; i++)
{
for (int j = 0; j < grspel; j++)
{
rec[i, j] = new Rectangle(50 + i * 50, 100 + j * 50, 50, 50);
}
}
DrawLabels();
}
public void DrawLabels()
{
label_1.Location = new Point(20, 50);
label_1.Text = "Zwart: " + zwart;
Controls.Add(label_1);
label_2.Location = new Point(330, 50);
label_2.Text = "Wit: " + wit;
Controls.Add(label_2);
}
public void DrawGrid(object o, PaintEventArgs pea)
{
MessageBox.Show("test");
for (int i = 0; i < 6; i++)
{
for (int j = 0; j < 6; j++)
{
pea.Graphics.DrawRectangle(new Pen(Brushes.Black), rec[i,j]);
}
}
}
为了可视化我的问题,我在DrawGrid方法的开头放置了MessageBox.Show("test");
。我的其余代码(这里没有)使用这个方法,并且不能正常工作。我已经将问题的范围缩小到这里。
去掉Controls.Add(label_i)
可以解决这个问题,但我需要标签。为什么会发生这种情况,更重要的是,我如何解决它?
发布于 2021-10-22 01:38:28
您添加了一个标签,因此会有一个UI更改并需要重新绘制的事件。它应该绘制添加的标签,对吗?我想这是意料之中的。
您不必每次都将标签添加到控件列表中。只需添加它们一次(例如在Form.Load
中)。
但是,更改标签的位置可能还需要重新绘制。它应该在新的位置绘制标签,对吗?但你的位置也是固定不变的。只需设置一次位置。
重新绘制是正常和良好的,因为它保持了内容的更新。这应该不是问题。那么,你为什么不喜欢呢?它可能会导致闪烁,而你不喜欢这样。
显示一个MessageBox可能也不是一个好主意。如果MessageBox在窗体前面,则需要重新绘制MessageBox后面的部分。
你可以的
,但我需要标签
实际上你不需要。你可以使用Graphics.DrawString()而不是标签。
https://stackoverflow.com/questions/69674302
复制相似问题