鼠标上线时如何划线?

时间:2015-06-04 06:52:56

标签: c# winforms drawing

我正在尝试设置LMB关闭时的起点,并在LMB启动时从起点到当前鼠标位置画一条线,就像MSPaint的做法一样。

我的问题是,当LMB启动时,我似乎无法让这条线出现在图片框上。有人可以开导我吗?

编辑:对不起家伙我意识到问题出在其他地方,但我在这个过程中学到了很多东西,感谢所有的输入。

public partial class FormPaint : Form
{    
    Point? startPoint = Point.Empty;
    Point? endPoint = Point.Empty;
    bool isMouseDown = new Boolean();

    private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
    {
        if (Control.MouseButtons == MouseButtons.Left)
        {
            startPoint = e.Location;
            isMouseDown = true;
        }
    }

    private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
    {

         brush = new SolidBrush(color);
         using (Graphics g = Graphics.FromImage(pictureBox1.Image))
         {
              g.DrawLine(new Pen(brush), startPoint.Value, endPoint.Value);
              pictureBox1.Invalidate();

         }

        isMouseDown = false;

    }
    private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
    {
      endPoint = e.Location;
    }
     private void pictureBox1_Paint(object sender, PaintEventArgs e)
    {
         using (brush = new SolidBrush(color))
         {
               e.Graphics.DrawLine(new Pen(brush, 5), startPoint.Value, endPoint.Value);
         }
    }
}

2 个答案:

答案 0 :(得分:0)

当你致电Invalidate时,它会强制重绘图片框。问题是,它丢弃了之前绘制的所有内容。然后它调用图片框上的Paint

我建议将绘图数据保存到列表中,并使用保存的数据在图片框的Paint事件中执行绘画。

另请阅读How do I draw a circle and line in the picturebox?

答案 1 :(得分:0)

使用线条预览完成示例,享受。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WinForm
{
    public partial class frmMain : Form
    {
        /// <summary>
        /// form constructor
        /// </summary>
        public frmMain()
        {
            InitializeComponent();
        }

        private PictureBox imgCanvas;
        private bool isMouseDown;
        private Point startPoint;
        private Point currentPoint;

        /// <summary>
        /// form load
        /// </summary>
        protected override void OnLoad(EventArgs e)
        {
            base.OnLoad(e);

            imgCanvas = new PictureBox
            {
                Location = new Point(8, 8),
                Size = new Size(this.ClientSize.Width - 16, this.ClientSize.Height - 16),
                Anchor = AnchorStyles.Left | AnchorStyles.Top | AnchorStyles.Right | AnchorStyles.Bottom,
                BorderStyle = BorderStyle.Fixed3D,
            };
            imgCanvas.MouseDown += imgCanvas_MouseDown;
            imgCanvas.MouseUp += imgCanvas_MouseUp;
            imgCanvas.MouseMove += imgCanvas_MouseMove;
            imgCanvas.Paint += imgCanvas_Paint;
            this.Controls.Add(imgCanvas);
        }

        void imgCanvas_Paint(object sender, PaintEventArgs e)
        {
            if (isMouseDown)
            {
                e.Graphics.DrawLine(Pens.Red, startPoint, currentPoint);
            }
        }

        void imgCanvas_MouseMove(object sender, MouseEventArgs e)
        {
            if (isMouseDown)
            {
                currentPoint = e.Location;
                (sender as PictureBox).Refresh();
            }
        }

        void imgCanvas_MouseDown(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                isMouseDown = true;
                startPoint = e.Location;
            }
        }

        void imgCanvas_MouseUp(object sender, MouseEventArgs e)
        {
            if (isMouseDown)
            {
                if (e.Button == MouseButtons.Left)
                {
                    isMouseDown = false;

                    PictureBox pb = sender as PictureBox;

                    // create image
                    if (pb.Image == null)
                    {
                        pb.Image = new Bitmap(pb.ClientSize.Width, pb.ClientSize.Height);
                    }

                    // draw
                    using (Graphics g = Graphics.FromImage(pb.Image))
                    {
                        g.DrawLine(Pens.Green, startPoint, e.Location);
                        pb.Refresh();
                    }
                }
            }
        }
    }
}

结果:

Screenshot