2

我正在使用 C# 开发一个在面板内有一个图片框的简单工具。该面板具有属性 Autoscroll = true。如果该图片框的图像大于面板,则面板具有滚动条

我可以在图片框的绘制事件上绘制一个矩形。但是当我滚动时,这个矩形消失了。我知道它需要在移动滚动条后重新绘制它,但我不知道如何再次恢复它。

x、y、width、heigth、zoom 是全局变量,当使用 click in to treenode 时,它​​会有数据。

private void pictureBoxView_Paint(object sender, PaintEventArgs e)
        {
            if (choose == true)
            {
                Size newSize = new Size((int)(pictureBoxView.Image.Width * zoom),
                                       (int)(pictureBoxView.Image.Height * zoom));
                Graphics graphic = pictureBoxView.CreateGraphics();
                Pen pen = new Pen(Color.Red, 3);
                graphic.DrawRectangle(pen, x, y, width, height);
                pen.Dispose();
            }
        }


 private void treeViewTemplate_AfterSelect(object sender, TreeViewEventArgs e)
        {
            // refresh picturebox
            pictureBoxView.Refresh();

            // allow repaint
            choose = true;

            string[] value = treeViewTemplate.SelectedNode.Tag.ToString().Split(',');
            x = Int32.Parse(value[0]);
            y = Int32.Parse(value[1]);
            width = Int32.Parse(value[2]);
            height = Int32.Parse(value[3]);
            zoom = Double.Parse(value[4]);

            //MessageBox.Show("x = " + y + ", y = " + y + ", width = " + width + ", height = " + height + ", zoom = " + zoom);

            // This call draw a rectangle again when I choose a value from TreeNode's Tag

            pictureBoxView_Paint(this, null);
        }
4

3 回答 3

1

你也可以使用 pictureBoxView.Refresh()

并定义两个局部变量通过 ScrollEventArgs.NewValue 保存滚动偏移量

如果你不想在滚动时绘画,你可以使用这个

private void panel1_Paint(object sender, PaintEventArgs e) { pictureBox1.Refresh();}

于 2013-02-20T09:03:16.853 回答
0

通常,您应该使用Invalidate方法来重绘控件的表面:

pictureBoxView.Invalidate();

这是重绘 aPictureBox内部的示例 a Panel

private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
    var rectangle = new Rectangle(10, 10, 100, 100);
    e.Graphics.DrawRectangle(Pens.Red, rectangle);
}

private void panel1_Scroll(object sender, ScrollEventArgs e)
{
    pictureBox1.Invalidate();
}

滚动面板时会重绘固定的红色矩形。

于 2013-02-20T08:15:46.077 回答
0

在这种情况下(PictureBox在 Panel 控件中),您必须创建一个在图片框上绘图的方法。并且您将绘图方法放在 Panel 中ScrollEvent

private void panel1_Scroll(object sender, ScrollEventArgs e)
    {
        Drawing();
    }
于 2019-06-23T13:50:09.203 回答