菜鸟求助,C# 画点画线问题

b13438954778 2013-12-06 03:21:08
请教各位大神,我想在同一个picturebox上点击画点或画线按钮分别实现画点和画线。
目前我采用的是pictureBox_MouseClick中实现画点, pictureBox_MouseDown和pictureBox_MouseUp中实现画线。
单独实现画点或画线能实现了。但是放在一起出现了Click和MouseDown、MouseUp 的冲突,不知道该如何解决啊?
...全文
1570 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
szclwen 2015-08-07
  • 打赏
  • 举报
回复
学习到了~~~
bigbaldy 2013-12-09
  • 打赏
  • 举报
回复
引用 15 楼 b13438954778 的回复:
[quote=引用 13 楼 bigbaldy 的回复:] 给你一个我刚写的画板程序,满足你所有需求 http://download.csdn.net/detail/bigbaldy/6679559
能不能发一个低版本的给我,我VS2010无法打开,谢谢!我用TXT看貌似很好,比楼上的简单 [/quote] 你把.sln文件删除,然后用你的2010新建空白解决方案,鼠标右键->添加->现有项目,选择我目录下面的.csproj文件即可
men52676521 2013-12-09
  • 打赏
  • 举报
回复
b13438954778 2013-12-09
  • 打赏
  • 举报
回复
引用 13 楼 bigbaldy 的回复:
给你一个我刚写的画板程序,满足你所有需求 http://download.csdn.net/detail/bigbaldy/6679559
能不能发一个低版本的给我,我VS2010无法打开,谢谢!我用TXT看貌似很好,比楼上的简单
xjw163 2013-12-08
  • 打赏
  • 举报
回复 1
求源代码。求sln文件,各种求
引用 2 楼 hwenycocodq520 的回复:
写了个简单的例子给你,你参考看看

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();
}
木_玉 2013-12-08
  • 打赏
  • 举报
回复
引用 2 楼 hwenycocodq520 的回复:
写了个简单的例子给你,你参考看看 [/code]
学习到了
bigbaldy 2013-12-08
  • 打赏
  • 举报
回复
给你一个我刚写的画板程序,满足你所有需求 http://download.csdn.net/detail/bigbaldy/6679559
sswwee 2013-12-06
  • 打赏
  • 举报
回复
绑定鼠标那几个事件不是正确的方法,你想想ps,各种工具是不是都一个按钮啊
b13438954778 2013-12-06
  • 打赏
  • 举报
回复
引用 3 楼 hunshy 的回复:
用这个方法无需选画点还是画点,只要确定你的颜色、点大小和线宽就好。 当然你可以有另外一种方式:选画点的时候鼠标按下和鼠标移动事件都记录点。类似于画图的笔效果。 跳过记录点已画点和已画线这件事的话,画线的时候你可能要想别的方法实现当前线的方法了。。因为不确定位置的当前线也是需要绘制到画板上的。
你说的应该可以用,可是我想实现的是点画点按钮实现的就是画点,点画线按钮实现的就是画线
智商余额不足 2013-12-06
  • 打赏
  • 举报
回复
引用 4 楼 yuwenge 的回复:
智商余额不足为毛老有时间来写这些demo的代码呢?
其他帖子很多不会啊,找个自己稍微熟点的来答
zmidl 2013-12-06
  • 打赏
  • 举报
回复
引用 5 楼 sj2860 的回复:
[quote=引用 4 楼 yuwenge 的回复:] 智商余额不足为毛老有时间来写这些demo的代码呢?
人家写这些代码不需要时间的[/quote] 很多功能代码可以自己封装的 难道每一次写 都从头开始吗
dylike 2013-12-06
  • 打赏
  • 举报
回复
2楼的写得不错
-Sykes 2013-12-06
  • 打赏
  • 举报
回复
引用 4 楼 yuwenge 的回复:
智商余额不足为毛老有时间来写这些demo的代码呢?
人家写这些代码不需要时间的
卧_槽 2013-12-06
  • 打赏
  • 举报
回复
智商余额不足为毛老有时间来写这些demo的代码呢?
Hunshy 2013-12-06
  • 打赏
  • 举报
回复
用这个方法无需选画点还是画点,只要确定你的颜色、点大小和线宽就好。 当然你可以有另外一种方式:选画点的时候鼠标按下和鼠标移动事件都记录点。类似于画图的笔效果。 跳过记录点已画点和已画线这件事的话,画线的时候你可能要想别的方法实现当前线的方法了。。因为不确定位置的当前线也是需要绘制到画板上的。
智商余额不足 2013-12-06
  • 打赏
  • 举报
回复
写了个简单的例子给你,你参考看看


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();
}
Hunshy 2013-12-06
  • 打赏
  • 举报
回复
思路是这样:用以下四个事件,不要用click 鼠标按下:  记录已按下标志  记录按下位置 鼠标移动:  如果已按下,  重画界面  画从按下位置至当前位置的线(动态的当前线)。 鼠标松开:  取消已按下标志  如果当前位置与按下位置一致则记录该点  否则记录该线  重画界面 重画界面:  画出记录下的所有点和线。

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧