简介
这是我在我的业余时间开发的绘图工具,它可以绘制矩形,圆和其他形状,您还可以移动,调整大小,甚至一些旋转的形状。这将是一个有用的出发点复杂的图形项目。背景
要充分认识这段代码中,用户了解一些C#的概念,反思,接口,继承等,这个绘图工具还有另一个版本使用WPF,您可以找到{A}。使用代码
该项目首先创建一个工具箱,其中包含所有可用的绘图工具。像下面的屏幕截图:
{S0}
,然后用户可以选择这些工具来绘制主屏幕上,屏幕捕获类似于以下内容:
{S1}
这个项目还附带了一个用户的PropertyBag,动态地改变形状边框的颜色,填充颜色,箭头宽度,文本框的内容,文字的大小,等
{S2}
这个项目终于提供了一个导出为XML文件或JPG文件的绘图选项的用户。
上面的XML文件,该项目可以打开此文件的下一次,用户可以编辑自己的图纸。
完成后,用户可以选择将其导出为JPG文件。
以下是该项目的解释。
我已经定义了几个基本的形状,LeShape是基础类,以序列化我所创建的形状,我已经重新定义LeColor结构,像下面:
{C}
我们不能序列化C#中的字体和颜色类XML,我创造了他们相当于结构,并用他们无处不在。
这个绘图工具的基本类LeShape: public abstract class LeShape : IShape
{
private bool showBorder = true;
public bool ShowBorder
{
get { return showBorder; }
set
{
showBorder = value;
LeCanvas.self.Canvas.Invalidate();
}
}
private LeColor borderColor = new LeColor(Color.Black);
public LeColor LeBorderColor
{
get { return borderColor; }
set
{
borderColor = value;
LeCanvas.self.Canvas.Invalidate();
}
}
[XmlIgnore]
public Color BorderColor
{
get { return LeBorderColor.ToColor(); }
set { LeBorderColor = new LeColor(value); }
}
private int borderWidth = 1;
public int BorderWidth
{
get { return borderWidth; }
set
{
borderWidth = value;
LeCanvas.self.Canvas.Invalidate();
}
}
private Rectangle bounds;
[XmlIgnore]
public Rectangle Boundary
{
set { bounds = value;
Rect =new LeRect(value);
}
get { return bounds; }
}
...
public LeShape()
{
path = new GraphicsPath();
objectsInPath = new ArrayList();
}
正如你可以看到,这LeShape类是抽象类,因为我们不希望用户在任何时候实例。相反,我们创建ZoneShape,矩形,基于此LeShape类,然后我们实例化,它更有意义。
为了让用户移动,调整大小形状,我做了另一个类BoundaryShape,它继承自LeShape,其中包含的所有属性,而这BoundaryShape仅处理用户的鼠标移动,它不会被序列化到XML文件。
基本上所有的形状将继承BoundaryShape,并BoundaryShape从LeShape继承。public class RoundRectShape : BoundaryShape
{
private int radius = 10;
我们可以有圆角半径的形状,默认情况下,半径为10像素。
我们使用下面的paint方法,得出这样的垄断的矩形形状。 public override void Paint(object sender, Graphics g)
{
Point[] pt = new Point[8];
path = new GraphicsPath();
path.AddLine(pt[4], pt[5]);
path.AddArc(new Rectangle(pt[6], new Size(radius, radius)),
90, 90);
path.AddLine(pt[6], pt[7]);
if (path != null)
{
g.FillPath(new System.Drawing.Drawing2D.LinearGradientBrush(
Boundary, FromColor, ToColor, LightAngle), path);
}
}
这个paint方法在BoundaryShape副本,我们不想使用它,因此我们把它作为改性剂覆盖。
,您还将看到LeShape实施IShape接口。
我LeShape IShape实施虚拟方法。然后在其继承的类,有选择性地重写这些虚方法。
ZoneShape有一个文本字段,这个想法是ZoneShape动作,文本字段以及移动。这是当用户完成移动zoneshape,然后引发事件BoundaryShape,ZoneShape接受这个事件,然后处理此事件,将文本字段参数。
用户的鼠标移动LeCanvas类处理,LeCanvas类,那么这个事件传递到所有屏幕上的形状。每个形状,然后决定自己的行动。无论它的绘图开始,或移动形状或调整形状的大小。尾注
我想计算机的世界里,我总是喜欢学习他人的,或者为他人,也许觉得我的工作是有用的贡献。