c#——绘制任意轨迹的画板

    技术2022-05-20  45

           前两天群的一同仁,求助写一个可以绘制任意图形程序。经了解后就是一个可以用鼠标绘制任意轨迹的画板。同仁强烈要求能否给些绘图相关的示例。小的不才,因为写过天GDI+相关的程序,本着码农本份,就在晚上花了40分钟写了这个画板。虽不是什么给力神马,但也不敢私藏,现贴出来和大家一起学习学习,还请多多指教。

           废话有些太多,赶紧入正题。

           平台:.Net Framework 3.5,技术:WinForm GDI+

           写个东西首先想的是在鼠标移动并且鼠标左键按下时,记录MouseMove过程中的点。然后把这些记录下来的点连接起来就成了绘制的任意图形。用什么来记录这些点呢?第一反映是建立一窗体,在窗体类里添加一个点集合的数据成员。但要是多画几个图形呢,那不就得多个点集合的数据成员!?于是建一线类来保存这些点,线类“有一个”点集属性。因为鼠标每次移动都会添加一个点,所以线类里应该有一个添加点的方法。需要把线类的图形重绘到窗体客户区上,所以添加了一个绘制方法。这里我们用了GDI+里的DrawLines方法。为了把窗体客户区的绘图表面传递到绘制方法里,给绘制方法添加了一个绘图表面的参数。最后补上相应的构造器,以及相应的数据成员初始化。

    线类完整代码如下:

    public class Line { public List<Point> Points { get; set; } public int PointCount { get { return Points.Count; } } public Line() { Points = new List<Point>(); } public Line(Point startPoint):this() { Points.Add(startPoint); } public void Add(Point point) { Points.Add(point); } public void Draw(Graphics g) { if (PointCount <= 1) return; Point[] pointArray = Points.ToArray(); g.DrawLines(Pens.Black, pointArray); } }

           线类代码好了后,就是怎么用这个类进行绘制了。新建一个窗体作为画布。在窗体中放一个线类的集合,以存放绘制的多条线。为了方便描述正在绘制的线,再添加一个正在绘制的线的引用作为窗体的数据成员。

           现在来看一条的的绘制过程:

           按照上图,鼠标事件响应函数就很好写了。

           最后,万事具备,只欠东风了:就是把内存中的线重绘到窗体的绘图表面。这里在Paint事件响应函数里,调用各个线类的绘制方法就OK了。注意绘图表面从Paint事件的事件参数PaintEventArgs里去取。画布窗体的代码如下:

    public partial class Canvas : Form { private List<Line> lines; private Line drawingLine; public Canvas() { InitializeComponent(); InitializeCanvas(); } private void InitializeCanvas() { lines = new List<Line>(); } private void Canvas_MouseMove(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) { Point location = e.Location; drawingLine.Add(location); Invalidate(); } } private void Canvas_MouseDown(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) { Point location = e.Location; drawingLine = new Line(location); lines.Add(drawingLine); } } private void Canvas_Paint(object sender, PaintEventArgs e) { foreach (var line in lines) { line.Draw(e.Graphics); } } }

     

    后记: 以上代码只是一个简单的思路,有兴趣的朋友可以向里面其它功能以满足特定的需要。比如可修改线的颜色、宽度、线型等,还有添加橡皮擦功能等等。需要完整的可运行代码的朋友请点击这里下载:

    http://download.csdn.net/source/3045030

     


    最新回复(0)