在移动鼠标并按住右键的同时绘制一条线

本文关键字:绘制 一条 右键 鼠标 移动 | 更新日期: 2023-09-27 18:28:59

我想在按住右键的同时移动鼠标,在面板上画一条线。以下是我迄今为止所尝试的:

private void panel1_MouseDown(object sender, MouseEventArgs e)
{
    Point point = panel1.PointToClient(Cursor.Position);
    Point cordinatedClikedPoint = new Point(xPanelPosition, yPanelPositon);
    DrawPoint((point.X), (point.Y), Color.Navy);                
}
public void DrawPoint(int x, int y, Color color)
{
    Graphics g = this.panel1.CreateGraphics();
    Pen pen = new Pen(color);
    g.DrawRectangle(pen, x, y, 3, 3);
}

在移动鼠标并按住右键的同时绘制一条线

只需使用MouseDownMouseUp事件设置布尔变量,即可在MouseMove事件处理程序中绘制。由于您直接调用图形对象,面板上的任何无效或重新绘制操作都会导致它被清除,因此其他两个答案解决了这一问题。

public partial class Form1 : Form
{
    bool mouseIsDown;
    public Form1()
    {
        InitializeComponent();
    }
    private void panel1_MouseDown(object sender, MouseEventArgs e)
    {
        if (e.Button== System.Windows.Forms.MouseButtons.Right)
            mouseIsDown = true;
    }
    private void panel1_MouseMove(object sender, MouseEventArgs e)
    {
        if (mouseIsDown)
        {
            Point point = panel1.PointToClient(Cursor.Position);
            DrawPoint((point.X), (point.Y), Color.Navy);
        }
    }
    private void panel1_MouseUp(object sender, MouseEventArgs e)
    {
        mouseIsDown = false;
    }
    public void DrawPoint(int x, int y, Color color)
    {
        Graphics g = this.panel1.CreateGraphics();
        Pen pen = new Pen(color);
        g.DrawRectangle(pen, x, y, 3, 3);
    }
}

另一个。。。这次使用ControlPaint。DrawReversibleLine():

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }
    private Point StartPoint, EndPoint;
    private void panel1_MouseDown(object sender, MouseEventArgs e)
    {
        if (e.Button == System.Windows.Forms.MouseButtons.Right)
        {
            Point pt = Cursor.Position;
            StartPoint = pt;
            EndPoint = pt;
            ControlPaint.DrawReversibleLine(StartPoint, EndPoint, Color.Black);
        }
    }
    private void panel1_MouseMove(object sender, MouseEventArgs e)
    {
        if (e.Button == System.Windows.Forms.MouseButtons.Right)
        {
            ControlPaint.DrawReversibleLine(StartPoint, EndPoint, Color.Black); // erase previous line
            EndPoint = Cursor.Position;
            ControlPaint.DrawReversibleLine(StartPoint, EndPoint, Color.Black); // draw new line
        }
    }
    private void panel1_MouseUp(object sender, MouseEventArgs e)
    {
        if (e.Button == System.Windows.Forms.MouseButtons.Right)
        {
            ControlPaint.DrawReversibleLine(StartPoint, EndPoint, Color.Black); // erase previous line
            // ... do something with StartPont and EndPoint in here ...
            // possibly add them to a class level structure to use in the Paint() event to make it persistent?
        }
    }
}

试试这个,你需要在每次绘制时使面板无效。

private IList<Point> _pointList = new List<Point>();
private void panel1_MouseMove(object sender, MouseEventArgs e)
{    
    _pointList.Add( e.Location );
    panel1.Invalidate(); //force a repaint
}
private void panel1_Paint( object sender, PaintEventArgs e )
{
    e.Graphics.DrawLines( Pens.Black, _pointList );
}

我认为这是您尝试做的事情的完整解决方案:

public partial class Form1 : Form
{
    private Graphics g;
    private readonly Pen pen = new Pen(Color.Navy, 7);
    private Point oldCoords;
    private readonly GraphicsPath graphicsPaths = new GraphicsPath();
    public Form1()
    {
        InitializeComponent();
        g = panel1.CreateGraphics();
    }
    private void panel1_MouseMove(object sender, MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Left)
        {
            if (oldCoords.IsEmpty)
                graphicsPaths.StartFigure();
            else
            {
                graphicsPaths.AddLine(oldCoords, new Point(e.X, e.Y));
                g.DrawPath(pen, graphicsPaths);
            }
            oldCoords= new Point(e.X,e.Y);
        }
        else
            oldCoords = Point.Empty;
    }
    private void panel1_Paint(object sender, PaintEventArgs e)
    {
        g.DrawPath(pen, graphicsPaths);
    }
}

干杯:)

据我所知,按下按钮时MouseDown事件会一次性触发。WindowsForms面板/窗体或其他任何东西每隔几毫秒就会重新绘制一次。因此,您需要将该代码放入OnPaint方法中。

它应该看起来像这样:

//global variable
bool isDragging = false;
private void panel1_MouseDown(object sender, MouseEventArgs e)
{
            isDragging = true;               
}
private void panel1_MouseUp(object sender, MouseEventArgs e)
{
            isDragging = false;               
}
private void form_Paint(object sender, EventArgs e)
{
            if(isDragging)
            {
               Point point = panel1.PointToClient(Cursor.Position);
               Point cordinatedClikedPoint = new Point(xPanelPosition, yPanelPositon);
               DrawPoint((point.X), (point.Y), Color.Navy);
            }
}