首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

初学者,C# 画点画线有关问题

2013-12-10 
菜鸟求助,C# 画点画线问题请教各位大神,我想在同一个picturebox上点击画点或画线按钮分别实现画点和画线。

菜鸟求助,C# 画点画线问题
请教各位大神,我想在同一个picturebox上点击画点或画线按钮分别实现画点和画线。
目前我采用的是pictureBox_MouseClick中实现画点, pictureBox_MouseDown和pictureBox_MouseUp中实现画线。
单独实现画点或画线能实现了。但是放在一起出现了Click和MouseDown、MouseUp 的冲突,不知道该如何解决啊?


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();
}

[解决办法]
绑定鼠标那几个事件不是正确的方法,你想想ps,各种工具是不是都一个按钮啊
[解决办法]
给你一个我刚写的画板程序,满足你所有需求
http://download.csdn.net/detail/bigbaldy/6679559
[解决办法]
引用:
Quote: 引用:

给你一个我刚写的画板程序,满足你所有需求
http://download.csdn.net/detail/bigbaldy/6679559

能不能发一个低版本的给我,我VS2010无法打开,谢谢!我用TXT看貌似很好,比楼上的简单


你把.sln文件删除,然后用你的2010新建空白解决方案,鼠标右键->添加->现有项目,选择我目录下面的.csproj文件即可

热点排行