上次在《原来我是这样学习编程的》里面最后提到了自己编写的一个小程序。在编写那个小程序时,自己也有一点心得,现在就写出来,与大家分享。
大家可以看一下这个程序的界面:
其中程序界面左侧的画图区域就是根据右侧Input内变量利用Graphics画出来的图形。
先说一下我编这个程序过程中思路的变化吧(这是我用C#编的第一个程序,经验不足,当然要走些弯路了)。
1、实现基本绘图功能。在窗体的左侧添加一个panel组件,利用panel的CreateGraphics()方法创建一个Graphics对象,接下来就是根据初始条件和一些公式计算出的结果在新创建的Graphics上绘图。当然,那个横竖交叉的坐标轴在Graphics初始化时就绘制了,程序运行过程中要始终保持它的存在,因此每次调用Graphics的Clear()方法后总要先把坐标轴画上。
这其中画坐标轴是利用Graphics的DrawLine()方法;描点时由于没发现Graphics有DrawPoint()的方法,所以采用了画椭圆的方法DrawEllipse()方法,只是让椭圆小点,看起来像个点一样。也不知道这种方法是不是太笨拙了!
这样,基本的绘图功能就实现了,再添加一个Timer后,就实现了点随时间变化的物理现象的模拟。效果还不可以。但是当Timer的 Interval属性(这个属性是Timer的时间间隔)太小时(<10),图像就会有闪烁的感觉。
2、增加点功能——把画好的图像保存成图像文件。在MSDN和网络上找来找去发现利用上面的方法几乎很难把绘制好的图像保存成图像文件。后俩就改变了思路:把前面的panel组件换成pictureBox组件,声明一个位图BitMap的对象,以BitMap对象为源创建Graphics对象。这样就是直接在BitMap对象上画图,图像绘制好以后,利用pictureBox组件显示绘制好的Bitmap对象。以上操作从绘图角度来看与上面方法所得到的结果是一致的。
这样做的另外一个好处就是可以利用BitMap的保存文件的方法来实现绘制好的图像文件的保存,当然直接用pictureBox的方法保存文件也起到一样的效果。保存文件不难,这里就不说了。
利用现在的方法我还收到了一份意外的惊喜:在Timer的Interval属性很小时图像加载也不会有闪烁的感觉。回过头来想,这也不是什么意外。因为绘图的过程总比加载图像的过程要长些,现在是绘制过程在程序内部完成,并没有让用户看到,只是利用很短的时间进行了图像的加载,当然就很那看出来图像的闪烁了。
就通过这样两种不同的方法之间思路的转变,我找到了解决我自己提出的问题的方法,感觉蛮有成就感的。
当然里面可能还有很多不成熟的地方,欢迎大家批评指正!