解决不能在窗体构造函数中绘制图形的问题(.NET)
众所周知,.NET在窗体上绘制图像使用的是GDI+,通常在都是在Form1_Paint()函数(即Paint事件的处理函数)中编写绘制函数。例如:
private void Form1_Paint(object sender, PaintEventArgs e)
{
Graphics g = e.Graphics;
Pen p = new Pen(Color.Red, 7);
g.DrawLine(p, 1, 1, 100, 100);
}
{
Graphics g = e.Graphics;
Pen p = new Pen(Color.Red, 7);
g.DrawLine(p, 1, 1, 100, 100);
}
代码1:这个函数实现了在窗体上绘制一条红色直线。
而我把同样的代码写在了窗体的构造函数中,却显示不出来,让我很是不解。
public Form1()
{
InitializeComponent();
Graphics g = this.CreateGraphics();
Pen p = new Pen(Color.Red, 7);
g.DrawLine(p, 1, 1, 100, 100);
}
{
InitializeComponent();
Graphics g = this.CreateGraphics();
Pen p = new Pen(Color.Red, 7);
g.DrawLine(p, 1, 1, 100, 100);
}
代码2:把绘制函数写了窗体构造函数
两代码唯一的不同就是得到Graphics的方式不同,代码1中是参数传进来的,代码2中是用CreateGraphics函数创建的,而我把代码1中的e.Graphics改成了this.CreateGraphics()依然能绘制出来,这就是说明了不是这个问题。
然后我就想到了这个两个函数的调用时间不同,通过在这个两个函数的入口和出口设置断点,通过调试观察到达这些断点的顺序,发现Form1_Paint()总是在Form1()执行完之后才调用。这就不禁会让人想到在执行这个函数之间.NET还做了一些其他操作,使Form1_Paint()能够顺利执行。这么说来就不能在窗体构造函数中绘制图形了?非也。通过研究发现,只要在绘图的语句前加上this.Show()语句,让窗体提前显示出来(这里的显示并不是立即就能看到,而是相当于把画布准备好),就可以绘制出图形了。运行的结果就和在Form1_Paint()中绘制的效果一样了。
public Form1()
{
InitializeComponent();
Show(); //关键的一行
Graphics g = this.CreateGraphics();
Pen p = new Pen(Color.Red, 7);
g.DrawLine(p, 1, 1, 100, 100);
}
{
InitializeComponent();
Show(); //关键的一行
Graphics g = this.CreateGraphics();
Pen p = new Pen(Color.Red, 7);
g.DrawLine(p, 1, 1, 100, 100);
}
代码3:在构造函数中调用Show()函数,就可以在构造函数中绘制图形了。