题:
您如何通过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);
}
}
}