滚动面板后恢复图形

时间:2013-02-20 08:13:11

标签: c# winforms panel picturebox invalidation

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

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

x,y,width,heigth,zoom是全局变量,当使用时点击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);
        }

3 个答案:

答案 0 :(得分:1)

你也可以使用pictureBoxView.Refresh()

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

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

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

答案 1 :(得分:0)

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

pictureBoxView.Invalidate();

以下是重新绘制PictureBox内的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();
}

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

答案 2 :(得分:0)

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

private void panel1_Scroll(object sender, ScrollEventArgs e)
    {
        Drawing();
    }