Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将抽绳图像绘制为Picturebox图像_C#_.net_Winforms_Paint_Picturebox - Fatal编程技术网

C# 将抽绳图像绘制为Picturebox图像

C# 将抽绳图像绘制为Picturebox图像,c#,.net,winforms,paint,picturebox,C#,.net,Winforms,Paint,Picturebox,在我的表单中,我有2个picturebox控件。我在pictureBox1上加载了一个蓝色背景图像,并将pictureBox2控件单独放在左侧。使用下面的代码,我可以在picturebox1图像上方绘制箭头 目标:在我的pictureBox1\u鼠标上我想将我在pictureBox1上绘制的所有箭头添加到pictureBox2 问题:问题出在我编写pictureBox1\u MouseUp时的pictureBox2.Image=pictureBox1.Image事件上,它没有添加我在pictur

在我的表单中,我有2个
picturebox
控件。我在
pictureBox1
上加载了一个蓝色背景图像,并将
pictureBox2
控件单独放在左侧。使用下面的代码,我可以在
picturebox1
图像上方绘制箭头

目标:在我的
pictureBox1\u鼠标上
我想将我在
pictureBox1
上绘制的所有箭头添加到
pictureBox2

问题:问题出在我编写
pictureBox1\u MouseUp
时的
pictureBox2.Image=pictureBox1.Image
事件上,它没有添加我在pictureBox1上绘制的箭头。它只添加我在表单加载事件中指定的pictureBox1图像

    private bool isMoving = false;
    private Point mouseDownPosition = Point.Empty;
    private Point mouseMovePosition = Point.Empty;
    private List<Tuple<Point, Point>> lines = new List<Tuple<Point, Point>>();
    Pen _Pen;

    private void pictureBox1_Paint(object sender, PaintEventArgs e)
    {

        if (isMoving)
        {
            if (pictureBox1.Image == null) e.Graphics.Clear(Color.White);

            // Add this line for high quality drawing:
            e.Graphics.SmoothingMode = SmoothingMode.HighQuality;

            AdjustableArrowCap bigArrow = new AdjustableArrowCap(5, 5);
            _Pen = new Pen(Color.IndianRed, 3);
            _Pen.CustomEndCap = bigArrow;
            e.Graphics.DrawLine(_Pen, mouseDownPosition, mouseMovePosition);
            _Pen.Dispose();
        }
    }

    private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
    {
        isMoving = true;
        mouseDownPosition = e.Location;
    }

    private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
    {
        if (isMoving)
        {
            mouseMovePosition = e.Location;
            pictureBox1.Invalidate();
        }
    }

    private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
    {

        if (isMoving)
        {
            lines.Add(Tuple.Create(mouseDownPosition, mouseMovePosition));
        }
        isMoving = false;

        pictureBox2.Image = pictureBox1.Image;
    }

测试2:(我从paint事件中获取代码,并将其粘贴到MouseMove事件中,做了一些修改。这会占用太多内存,并且不会在pictureBox1上绘制,但箭头现在在pictureBox2中可见)


这里有两个问题:

  • 在控件上绘制,而不是在图像上绘制。图像保持不变

  • pictureBox1
    pictureBox2
    均指同一图像。更改图像时,两个控件都将在下一个绘制事件中受到影响


  • 因此,在
    pictureBox1\u Paint
    中,您需要创建
    pictureBox1.Image
    的副本(尝试使用
    位图
    ),然后在其上绘制并将更新后的图像分配给
    pictureBox1.Image
    。它将自动绘制。

    将所有线条绘制到pictureBox1:

    仅绘制到pictureBox1的最后一行:

    pictureBox2
    控件中,将
    Paint
    事件添加到
    pictureBox2\u Paint

    我建议您使钢笔和帽子全球可变:

    // Make pen and cap global varriable to boost the perfomane.
    // Create and delete them each draw will cost alot of CPU
    Pen pen = new Pen(Color.IndianRed, 3);
    AdjustableArrowCap bigArrow = new AdjustableArrowCap(5, 5);
    
    Form1()
    事件中,添加此行:

    pen.CustomEndCap = bigArrow;
    
    并按以下步骤进行:

    public partial class Form1 : Form
    {
        private bool isMoving = false;
        private Point mouseDownPosition = Point.Empty;
        private Point mouseMovePosition = Point.Empty;
        private List<Tuple<Point, Point>> lines = new List<Tuple<Point, Point>>();
    
        public Form1()
        {
            InitializeComponent();
            pen.CustomEndCap = bigArrow;
        }
    
        private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
        {
            isMoving = true;
            mouseDownPosition = e.Location;
        }
    
        private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
        {
            if (isMoving)
            {
                mouseMovePosition = e.Location;
                pictureBox1.Invalidate();
            }
        }
    
        private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
        {
            if (isMoving)
            {
                lines.Add(Tuple.Create(mouseDownPosition, mouseMovePosition));
                pictureBox2.Invalidate();
            }
            isMoving = false;
        }
    
        private void pictureBox1_Paint(object sender, PaintEventArgs e)
        {
            if (isMoving)
            {
                if ((sender as PictureBox).Image == null) e.Graphics.Clear(Color.White);
    
                // Add this line for high quality drawing:
                e.Graphics.SmoothingMode = SmoothingMode.HighQuality;
    
                e.Graphics.DrawLine(pen, mouseDownPosition, mouseMovePosition);
    
                // If you want draw all previous lines here, add bellow code:
                //foreach (var line in lines)
                //{
                //    e.Graphics.DrawLine(pen, line.Item1, line.Item2);
                //}
            }
        }
    
        private void pictureBox2_Paint(object sender, PaintEventArgs e)
        {
            if ((sender as PictureBox).Image == null) e.Graphics.Clear(Color.White);
    
            e.Graphics.SmoothingMode = SmoothingMode.HighQuality;
            foreach (var line in lines)
            {
                e.Graphics.DrawLine(pen, line.Item1, line.Item2);
            }
        }
    }
    

    Andrey,你指的是我刚刚写的类似于测试1的代码吗?很高兴它能帮助你!
    pen.CustomEndCap = bigArrow;
    
    public partial class Form1 : Form
    {
        private bool isMoving = false;
        private Point mouseDownPosition = Point.Empty;
        private Point mouseMovePosition = Point.Empty;
        private List<Tuple<Point, Point>> lines = new List<Tuple<Point, Point>>();
    
        public Form1()
        {
            InitializeComponent();
            pen.CustomEndCap = bigArrow;
        }
    
        private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
        {
            isMoving = true;
            mouseDownPosition = e.Location;
        }
    
        private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
        {
            if (isMoving)
            {
                mouseMovePosition = e.Location;
                pictureBox1.Invalidate();
            }
        }
    
        private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
        {
            if (isMoving)
            {
                lines.Add(Tuple.Create(mouseDownPosition, mouseMovePosition));
                pictureBox2.Invalidate();
            }
            isMoving = false;
        }
    
        private void pictureBox1_Paint(object sender, PaintEventArgs e)
        {
            if (isMoving)
            {
                if ((sender as PictureBox).Image == null) e.Graphics.Clear(Color.White);
    
                // Add this line for high quality drawing:
                e.Graphics.SmoothingMode = SmoothingMode.HighQuality;
    
                e.Graphics.DrawLine(pen, mouseDownPosition, mouseMovePosition);
    
                // If you want draw all previous lines here, add bellow code:
                //foreach (var line in lines)
                //{
                //    e.Graphics.DrawLine(pen, line.Item1, line.Item2);
                //}
            }
        }
    
        private void pictureBox2_Paint(object sender, PaintEventArgs e)
        {
            if ((sender as PictureBox).Image == null) e.Graphics.Clear(Color.White);
    
            e.Graphics.SmoothingMode = SmoothingMode.HighQuality;
            foreach (var line in lines)
            {
                e.Graphics.DrawLine(pen, line.Item1, line.Item2);
            }
        }
    }
    
    private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
    {
        if (isMoving)
        {
            // You event don't need this line
            //lines.Add(Tuple.Create(mouseDownPosition, mouseMovePosition));
    
            if (pictureBox1.Image != null)
            {
                using (var g = Graphics.FromImage(pictureBox1.Image))
                {
                    g.SmoothingMode = SmoothingMode.HighQuality;
                    g.DrawLine(pen, mouseDownPosition, mouseMovePosition);
                }
                pictureBox2.Image = pictureBox1.Image;
            }
        }
        isMoving = false;
    }
    
    private void pictureBox1_Paint(object sender, PaintEventArgs e)
    {
        if (isMoving)
        {
            if ((sender as PictureBox).Image == null) e.Graphics.Clear(Color.White);
    
            e.Graphics.SmoothingMode = SmoothingMode.HighQuality;
            e.Graphics.DrawLine(pen, mouseDownPosition, mouseMovePosition);
        }
    }
    
    private void pictureBox2_Paint(object sender, PaintEventArgs e)
    {
    }