,欢迎访问网页设计爱好者web开发。前些日子在论坛上发了个帖子,100分寻求“橡皮条”法绘图的代码。效果不是很好,于是自己参照网友给的代码重新写了一个,解决了绘图与重绘的问题。由于只写了部分,所以功能有限,同时可能算法不是很好,希望大家指点!!窗体中仅包含一个pictruebox1,先将代码付诸于下:
using system;
using system.drawing;
using system.collections;
using system.componentmodel;
using system.windows.forms;
using system.data;
using system.drawing.drawing2d;
namespace gdi_练习
{
 /// <summary>
 /// form1 的摘要说明。
 /// </summary>
 public class form1 : system.windows.forms.form
 {
 public system.windows.forms.picturebox picturebox1;
 private point p1 = point.empty, p2 = point.empty;
 private bool ismousedown = false, ismouseup = false;
 
 arraylist addarray = new arraylist();
 public struct sharptype
 {
 public string type;
 public point p1, p2;
 public color forecolor, backcolor;
 public brush brush;
 public sharptype( string type, point p1, point p2, color forecolor, color backcolor, brush brush )
 {
 this.type = type;
 this.p1 = p1;
 this.p2 = p2;
 this.forecolor = forecolor;
 this.backcolor = backcolor;
 this.brush = brush;
 }
 }
 /// <summary>
 /// 必需的设计器变量。
 /// </summary>
 private system.componentmodel.container components = null;
 public form1()
 {
 //
 // windows 窗体设计器支持所必需的
 //
 initializecomponent();
 //
 // todo: 在 initializecomponent 调用后添加任何构造函数代码
 //
 }
 /// <summary>
 /// 清理所有正在使用的资源。
 /// </summary>
 protected override void dispose( bool disposing )
 {
 if( disposing )
 {
 if (components != null) 
 {
 components.dispose();
 }
 }
 base.dispose( disposing );
 }
 #region windows 窗体设计器生成的代码
 /// <summary>
 /// 设计器支持所需的方法 - 不要使用代码编辑器修改
 /// 此方法的内容。
 /// </summary>
 private void initializecomponent()
 {
 this.picturebox1 = new system.windows.forms.picturebox();
 this.suspendlayout();
 // 
 // picturebox1
 // 
 this.picturebox1.backcolor = system.drawing.color.white;
 this.picturebox1.dock = system.windows.forms.dockstyle.fill;
 this.picturebox1.location = new system.drawing.point(0, 0);
 this.picturebox1.name = "picturebox1";
 this.picturebox1.size = new system.drawing.size(432, 397);
 this.picturebox1.tabindex = 0;
 this.picturebox1.tabstop = false;
 this.picturebox1.paint += new system.windows.forms.painteventhandler(this.picturebox1_paint);
 this.picturebox1.mouseup += new system.windows.forms.mouseeventhandler(this.picturebox1_mouseup);
 this.picturebox1.mousemove += new system.windows.forms.mouseeventhandler(this.picturebox1_mousemove);
 this.picturebox1.mousedown += new system.windows.forms.mouseeventhandler(this.picturebox1_mousedown);
 // 
 // form1
 // 
 this.autoscalebasesize = new system.drawing.size(6, 14);
 this.clientsize = new system.drawing.size(432, 397);
 this.controls.add(this.picturebox1);
 this.name = "form1";
 this.text = "form1";
 this.resumelayout(false);
 }
 #endregion
 /// <summary>
 /// 应用程序的主入口点。
 /// </summary>
 [stathread]
 static void main() 
 {
 application.run(new form1());
 }
 private void picturebox1_mousedown(object sender, system.windows.forms.mouseeventargs e)
 {
 if( ! ismouseup )
 {
 this.ismousedown = true;
 this.p1 = new point( e.x, e.y );
 }
 
 }
 private void picturebox1_mousemove(object sender, system.windows.forms.mouseeventargs e)
 {
 graphics g = this.picturebox1.creategraphics();
 if( ismousedown && p2 != point.empty )
 g.drawellipse( pens.white, p1.x, p1.y, math.abs( p1.x - p2.x ), math.abs( p1.y - p2.y ) );
 if( ismousedown && ! ismouseup )
 {
 p2 = new point( e.x, e.y );
 g.drawellipse( pens.black, p1.x, p1.y, math.abs( p1.x - p2.x ), math.abs( p1.y - p2.y ) );
 }
 foreach( sharptype type in addarray )
 {
 g.drawellipse( pens.black, type.p1.x, type.p1.y, math.abs( type.p1.x - type.p2.x ), math.abs( type.p1.y - type.p2.y ) );
 }
 g.dispose();
 }
 private void picturebox1_mouseup(object sender, system.windows.forms.mouseeventargs e)
 {
 this.ismousedown = false;
 p2 = new point( e.x, e.y );
 graphics g = this.picturebox1.creategraphics();
 g.drawellipse( pens.black, p1.x, p1.y, math.abs( p1.x - p2.x ), math.abs( p1.y - p2.y ) );
 addarray.add( new sharptype( "a", p1, p2, color.black, color.empty, brushes.black ) );
 p1 = point.empty;
 p2 = point.empty;
 g.dispose();
 
 }
 private void picturebox1_paint(object sender, system.windows.forms.painteventargs e)
 {
 foreach( sharptype type in addarray )
 {
 e.graphics.drawellipse( pens.black, type.p1.x, type.p1.y, math.abs( type.p1.x - type.p2.x ), math.abs( type.p1.y - type.p2.y ) );
 }
 }
 
 }
}