题:
您如何通过OnPaint()方法以外的其他方法正确绘制Winform?

附加信息:
我现在使用的代码在OnPaint()方法中为TicTacToe游戏绘制了一些背景线。然后,我使用Mouse_Click事件并运行此代码,这显然是不合适的:

private void TicTacToe_MouseClick(object sender, MouseEventArgs e)
   Graphics g = this.CreateGraphics();
   g.DrawEllipse(this.penRed, this.Rectangle);


由于我不明白的原因,它确实绘制了圆圈,但是当最小化或将表格移出屏幕时,它将擦除圆圈,但不会擦除OnPaint()方法中的线条。

最佳答案

您正在做的是“异步”绘制表单(来自OnPaint方法)。您会看到,OnPaint方法是Windows窗体绘制整个窗体所依赖的方法。当您的“发件人”发生故障时,它会失效,并再次调用OnPaint。如果在该方法中未绘制某些内容,则在此之后该内容将不再存在。

如果您希望按钮触发某些东西永久显示,那么您需要做的就是将该对象添加到某个地方的集合中,或设置一个与之相关的变量。然后调用Refresh(),后者调用Invalidate()和Update()。然后在OnPaint期间绘制该对象(椭圆形)。

如果您希望它在表单发生变化(例如最小化)后仍然存在,则必须在OnPaint期间绘制它。

这是我的建议:

public partial class Form1 : Form
{
    Rectangle r = Rectangle.Empty;
    Pen redPen = new Pen(Color.Red);

    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        r = new Rectangle(50, 50, 100, 100);
        Refresh();
    }

    protected override void OnPaint(PaintEventArgs e)
    {
        base.OnPaint(e);

        if (r != Rectangle.Empty)
        {
            e.Graphics.DrawRectangle(redPen, r);
        }
    }
}

10-07 18:41