[已解决] 我正在尝试通过控制台和绘画来模拟“生活游戏”,但是我的表单是纯白色的。如何使我的方法可用?
在Visual Studio 2019中,这是我的第一次C#代码,只是为了与基于对象的语言相处。我尝试了基于事件的绘图(鼠标单击,按钮),一切都很好。
我的表单类如下:
public partial class Board : Form
{
private int BOARDWIDTH;
private int BOARDHEIGHT;
private int cellSize;
private bool paint = false; //ADDED IN
private World world;
Graphics drawArea;
public Board(World world, int cellsize)
{
this.BOARDHEIGHT = world.getWorldHeight() * cellsize;
this.BOARDWIDTH = world.getWorldWidth() * cellsize;
InitializeComponent();
drawingArea.SetBounds(0, 0, this.BOARDWIDTH, this.BOARDHEIGHT);
drawArea = drawingArea.CreateGraphics();
this.cellSize = cellsize;
this.world = world;
}
public void updateBoard(World world)
{
this.world = world;
}
protected override void OnPaint(PaintEventArgs e) // ADDED IN (Basically previous DrawCell inside)
{
base.OnPaint(e);
if(paint)
{
Rectangle rect = new Rectangle(x*this.cellSize, y*this.cellSize,
this.cellSize, this.cellSize);
if (this.world.getCellState(x, y))
{
rect.Height--;
rect.Width--;
using (Pen wPen = new Pen(Color.Black))
{
e.Graphics.DrawRectangle(wPen, rect);
}
}
else
{
using (SolidBrush bBrush = new SolidBrush(Color.Black))
{
e.Graphics.FillRectangle(bBrush, rect);
}
}
paint = false;
}
}
private void DrawCell(int x, int y) //CHANGED
{
this.x = x;
this.y = y;
paint = true;
}
public void DrawWorld(int refreshRate)
{
for(int i = 0; i < this.world.getWorldHeight(); i++)
{
for(int j = 0; j <this.world.getWorldWidth(); j++)
{
DrawCell(j, i);
}
}
}
}
}
我的主要表情如下:
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
World world = new World(20, 20);
world.createRandomWorld();
Board board = new Board(world, 10);
Application.Run(board);
board.DrawWorld(10);
}
我想得到一个黑色/白色正方形的网格,白色带边框。现在我唯一得到的是我的代码没有崩溃
[编辑]我添加了OnPaint
并改变了我的DrawCell
方法,现在我有了一些东西(绘制,是的),但是我只有一个单元格,而不是整个网格。另外,我的bool paint
解决方案感觉像是一种解决方法,而不是正确的解决方法。如果有的话,我很乐意看到“正确的”工作代码,因为我没有在Web(Microsoft页面)上提供的定义/示例没有向我展示如何使它以我的方式工作^。^ < / p>
答案 0 :(得分:1)
应该在每次调用World
时“按需”绘制整个OnPaint
,而不是尝试立即绘制“此单元格”。
例如,当Invalidate()
中的某些内容发生更改时,您可以通过在表单上调用World
来引起重新绘制。 OnPaint
也将自动被调用,例如,当您的表单首次显示时,或在被另一个窗口隐藏后重新出现时。
答案 1 :(得分:0)
好吧,所以在了解到我无法以“我的方式”完成操作(使用在Board类外部调用的方法在Form上绘制)之后,我做了一些重新设置,并添加了一个计时器+设置OptimizedDoubleBuffer
true
。感谢所有提供帮助的人,如果有人想看一下我现有的Board课程,它看起来像这样:https://pastebin.com/CP9XRN6r(不想用不必要的代码占用空间),希望您过得愉快,我的帖子有一天会帮助某人的^。^