C# 在picturebox控件的图形上保留一个元素并刷新另一个元素?

C# 在picturebox控件的图形上保留一个元素并刷新另一个元素?,c#,.net,visual-studio-2010,C#,.net,Visual Studio 2010,我想在画框上画一条连续的线,同时在光标处画一个十字。如何只在鼠标位置绘制光标(并在下一步移动时清除光标)并保留线条?这只是为了让您了解如何处理此问题 将PictureBox添加到表单。运行它并在PictureBox中单击并拖动: public partial class Form1 : Form { Point cursor; Point lastPoint; System.Drawing.Drawing2D.GraphicsPath curPath = null;

我想在画框上画一条连续的线,同时在光标处画一个十字。如何只在鼠标位置绘制光标(并在下一步移动时清除光标)并保留线条?

这只是为了让您了解如何处理此问题

将PictureBox添加到表单。运行它并在PictureBox中单击并拖动:

public partial class Form1 : Form
{

    Point cursor;
    Point lastPoint;
    System.Drawing.Drawing2D.GraphicsPath curPath = null;
    private List<System.Drawing.Drawing2D.GraphicsPath> paths = new List<System.Drawing.Drawing2D.GraphicsPath>();

    public Form1()
    {
        InitializeComponent();
        pictureBox1.MouseDown += new MouseEventHandler(pictureBox1_MouseDown);
        pictureBox1.MouseMove += new MouseEventHandler(pictureBox1_MouseMove);
        pictureBox1.Paint += new PaintEventHandler(pictureBox1_Paint);
    }

    void pictureBox1_Paint(object sender, PaintEventArgs e)
    {
        foreach (System.Drawing.Drawing2D.GraphicsPath gp in paths)
        {
            e.Graphics.DrawPath(Pens.Red, gp);
        }

        e.Graphics.DrawLine(Pens.Black, new Point(cursor.X, 0), new Point(cursor.X, pictureBox1.Height));
        e.Graphics.DrawLine(Pens.Black, new Point(0, cursor.Y), new Point(pictureBox1.Width, cursor.Y));
    }

    void pictureBox1_MouseDown(object sender, MouseEventArgs e)
    {
        if (e.Button == System.Windows.Forms.MouseButtons.Left)
        {
            lastPoint = new Point(e.X, e.Y);
            curPath = new System.Drawing.Drawing2D.GraphicsPath();
            paths.Add(curPath);
        }
    }

    void pictureBox1_MouseMove(object sender, MouseEventArgs e)
    {
        cursor = new Point(e.X, e.Y);

        if (e.Button == System.Windows.Forms.MouseButtons.Left)
        {
            Point newPoint = new Point(e.X, e.Y);
            curPath.AddLine(lastPoint, newPoint);
            lastPoint = newPoint;
            pictureBox1.Refresh();
        }

        pictureBox1.Refresh();
    }

}

公共部分类表单1:表单
{
点光标;
最后一点;
System.Drawing.Drawing2D.GraphicsPath curPath=null;
私有列表路径=新列表();
公共表格1()
{
初始化组件();
pictureBox1.MouseDown+=新的鼠标指针指针(pictureBox1\u MouseDown);
pictureBox1.MouseMove+=新的MouseEventHandler(pictureBox1\u MouseMove);
pictureBox1.Paint+=新的PaintEventHandler(pictureBox1\u Paint);
}
void pictureBox1_Paint(对象发送器,PaintEventArgs e)
{
foreach(路径中的System.Drawing.Drawing2D.GraphicsPath gp)
{
e、 图形.绘图路径(钢笔.红色,gp);
}
e、 图形.绘图线(钢笔.黑色,新点(光标.X,0),新点(光标.X,图片B,1.高度));
e、 图形.绘图线(钢笔.黑色,新点(0,光标.Y),新点(pictureBox1.Width,光标.Y));
}
void pictureBox1\u MouseDown(对象发送器,MouseEventArgs e)
{
if(e.Button==System.Windows.Forms.MouseButtons.Left)
{
最后一点=新点(e.X,e.Y);
curPath=new System.Drawing.Drawing2D.GraphicsPath();
添加(curPath);
}
}
void pictureBox1\u MouseMove(对象发送器,MouseEventArgs e)
{
光标=新点(e.X,e.Y);
if(e.Button==System.Windows.Forms.MouseButtons.Left)
{
新点=新点(e.X,e.Y);
AddLine(lastPoint,newPoint);
lastPoint=newPoint;
pictureBox1.Refresh();
}
pictureBox1.Refresh();
}
}

只需在PictureBox的Paint()事件中绘制“连续”线和十字光标即可。在MouseMove()事件中调用Refresh()。我认为这不起作用。想象你在MS画图中画了一条线。当你画一个“鼠标占位符”(例如,在水平面和一条垂直线für上,测量光标位置与图像的角线->标尺相关)时,就会画出来。这正是我想要做的。