我正在使用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);
}
答案 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();
}