【问题标题】:Keep Picturebox Image While Painting on top of it在其上绘画时保留 Picturebox 图像
【发布时间】:2018-03-16 11:22:46
【问题描述】:

在我的表单中,我有一个图片框。我希望能够在图像上绘制箭头。我设法走到了一半。在表单加载事件中,我将图像分配给图片框。我可以使用下面的代码创建箭头。问题是每次我创建箭头时,我在表单加载事件中分配的图片都会被删除。为什么我的图像会被删除?如何维护我在加载表单时分配的图像,同时在其顶部绘制箭头?

    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 Test_Load(object sender, EventArgs e)
    {
        pictureBox1.Image = Properties.Resources.background;          
    }

    private void pictureBox1_Paint(object sender, PaintEventArgs e)
    {

        if (isMoving)
        {
            if (pictureBox1.Image == null)
            {
                Bitmap bmp = new Bitmap(pictureBox1.Width, pictureBox1.Height);
                using (Graphics g = Graphics.FromImage(bmp))
                {
                    g.Clear(Color.White);
                }
                pictureBox1.Image = bmp;
            }

            using (Graphics g = Graphics.FromImage(pictureBox1.Image))
            {
                g.Clear(pictureBox1.BackColor);

                AdjustableArrowCap bigArrow = new AdjustableArrowCap(5, 5);
                _Pen = new Pen(Color.IndianRed, 3);
                _Pen.CustomEndCap = bigArrow;
                g.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;
    }

我认为问题在于这里的这条线g.Clear(pictureBox1.BackColor);

【问题讨论】:

    标签: c# .net winforms paint


    【解决方案1】:

    是的,这里的这条线有问题g.Clear(pictureBox1.BackColor);你在画线之前擦除了整个控制区域。

    你应该直接画到e.Graphics

    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();
        }
    }
    

    【讨论】:

    • 嗨,Sakura,这行得通。谢谢!这样就保留了背景图片并在上面画了箭头,但是你知道为什么picturebox图片不等于背景图片上方的绘制箭头吗?我测试的方法是我在表单中放了另一个图片框控件,然后写了picturebox2.image = picturebox1.image,它只显示了我的背景图片。
    • 将 ` if (pictureBox1.Image == null)` 更改为 ` if ((sender as PictureBox).Image == null)`。无论如何,我不清楚你的评论。如果可能,请使用新代码编辑您的问题,我会看看是否可以提供帮助
    • 嗨 Sakura,我在这里通过我运行的测试更详细地提出了这个问题。 stackoverflow.com/questions/46592322/…
    • @taji01 好的,我明白了问题所在。我会在几分钟内发布解决方案。
    猜你喜欢
    • 1970-01-01
    • 2012-07-17
    • 2012-11-15
    • 2020-06-17
    • 1970-01-01
    • 2013-11-26
    • 1970-01-01
    • 2019-10-16
    • 1970-01-01
    相关资源
    最近更新 更多