解决不能在窗体构造函数中绘制图形的问题(.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 );
}

代码1:这个函数实现了在窗体上绘制一条红色直线。

 

而我把同样的代码写在了窗体的构造函数中,却显示不出来,让我很是不解。

public  Form1()
{
    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 );
}

代码3:在构造函数中调用Show()函数,就可以在构造函数中绘制图形了。

你可能感兴趣的:(.net)