110,533
社区成员
发帖
与我相关
我的任务
分享
public abstract class DrawObject
{
public int Width { get; set; }
public Color Color { get; set; }
public float X { get; set; }
public float Y { get; set; }
public DrawObject()
{
Width = 1;
Color = Color.Black;
}
public abstract void Render(Graphics g);
}
public class DrawDot : DrawObject
{
public override void Render(Graphics g)
{
g.FillRectangle(new SolidBrush(Color), X, Y, Width, Width);
}
}
public class DrawLine : DrawObject
{
public Point StartPoint { get; set; }
public Point EndPoint { get; set; }
public override void Render(Graphics g)
{
g.DrawLine(new Pen(Color, Width), StartPoint, EndPoint);
}
}
public abstract class DrawTool
{
protected DrawCanvas canvas;
public DrawTool(DrawCanvas canvas)
{
this.canvas = canvas;
}
public abstract void MouseMove(MouseEventArgs e);
public abstract void MouseDown(MouseEventArgs e);
public abstract void MouseUp(MouseEventArgs e);
}
public class DrawDotTool : DrawTool
{
public DrawDotTool(DrawCanvas canvas)
: base(canvas)
{
}
public override void MouseDown(MouseEventArgs e)
{
DrawDot drawDot = new DrawDot();
drawDot.X = e.X;
drawDot.Y = e.Y;
drawDot.Width = canvas.DrawStyle.Width;
drawDot.Color = canvas.DrawStyle.Color;
canvas.AddDrawObject(drawDot);
}
public override void MouseMove(MouseEventArgs e)
{
}
public override void MouseUp(MouseEventArgs e)
{
}
}
public class DrawLineTool : DrawTool
{
private Point startPoint;
private Point endPoint;
private DrawLine drawline;
private bool isDrawing = false;
public DrawLineTool(DrawCanvas canvas)
: base(canvas)
{
}
public override void MouseDown(MouseEventArgs e)
{
startPoint = new Point(e.X, e.Y);
isDrawing = true;
drawline = new DrawLine();
drawline.Width = canvas.DrawStyle.Width;
drawline.Color = canvas.DrawStyle.Color;
canvas.AddDrawObject(drawline);
}
public override void MouseMove(MouseEventArgs e)
{
if (isDrawing)
{
endPoint = new Point(e.X, e.Y);
drawline.StartPoint = startPoint;
drawline.EndPoint = endPoint;
}
}
public override void MouseUp(MouseEventArgs e)
{
endPoint = new Point(e.X, e.Y);
drawline.StartPoint = startPoint;
drawline.EndPoint = endPoint;
isDrawing = false;
}
}
public struct DrawStyle
{
public Color Color;
public int Width;
}
public enum DrawType
{
Dot,
Line
}
public class DrawCanvas
{
private IList<DrawObject> drawObjects;
private Dictionary<DrawType, DrawTool> drawTools;
private DrawType currentDrawTool = DrawType.Line;
private Control canvas;
public DrawStyle DrawStyle;
public DrawType DrawToolType
{
get { return currentDrawTool; }
set
{
currentDrawTool = value;
}
}
public DrawCanvas(Control canvas)
{
this.canvas = canvas;
this.canvas.MouseDown += new MouseEventHandler(canvas_MouseDown);
this.canvas.MouseMove += new MouseEventHandler(canvas_MouseMove);
this.canvas.MouseUp += new MouseEventHandler(canvas_MouseUp);
this.canvas.Paint += new PaintEventHandler(canvas_Paint);
InitDrawTools();
}
void canvas_Paint(object sender, PaintEventArgs e)
{
Graphics g = e.Graphics;
g.Clear(canvas.BackColor);
RenderDrawObjects(g);
}
void canvas_MouseUp(object sender, MouseEventArgs e)
{
drawTools[currentDrawTool].MouseUp(e);
canvas.Invalidate();
}
void canvas_MouseMove(object sender, MouseEventArgs e)
{
drawTools[currentDrawTool].MouseMove(e);
canvas.Invalidate();
}
void canvas_MouseDown(object sender, MouseEventArgs e)
{
drawTools[currentDrawTool].MouseDown(e);
canvas.Invalidate();
}
void InitDrawTools()
{
drawTools = new Dictionary<DrawType, DrawTool>();
drawTools.Add(DrawType.Dot, new DrawDotTool(this));
drawTools.Add(DrawType.Line, new DrawLineTool(this));
drawObjects = new List<DrawObject>();
DrawStyle.Color = Color.Red;
DrawStyle.Width = 1;
}
void RenderDrawObjects(Graphics g)
{
foreach (DrawObject obj in drawObjects)
{
obj.Render(g);
}
}
public void AddDrawObject(DrawObject drawObject)
{
drawObjects.Add(drawObject);
}
public void Clear()
{
drawObjects.Clear();
canvas.Invalidate();
}
}
public partial class Form1 : Form
{
DrawCanvas canvas;
public Form1()
{
InitializeComponent();
BackColor = Color.Snow;
DoubleBuffered = true;
canvas = new DrawCanvas(this);
}
//工具点击事件 略
//设置画布属性
//canvas.DrawStyle.Color = Color.FromName("red");
//canvas.DrawStyle.Color = Color.FromArgb(0, 255, 0);
//canvas.DrawStyle.Color = Color.FromArgb(0, 0, 255);
//canvas.DrawStyle.Width = 1;
//canvas.DrawStyle.Width = 1;
//canvas.DrawStyle.Width = 3;
//canvas.DrawStyle.Width = 5;
//canvas.DrawToolType = DrawType.Dot;
//canvas.DrawToolType = DrawType.Line;
//canvas.Clear();
}