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