PictureBox调整大小&油漆问题

时间:2009-01-28 10:23:56

标签: c# winforms resize picturebox paint

我想在Winform应用程序中显示一些图形,它将是一个股票图表绘图工具。我想(但我不确定......)我必须使用PictureBox,并使用System.Drawing.Graphics类的绘图基元来绘制图表。我已经开始编码了,现在它或多或少都有效,但我对调整大小功能有一个问题,如下所示:当我调整整个表单大小时,我看到程序显示图形然后立即清除它。当我停止鼠标移动(不释放鼠标按钮)时,图形消失了!?!?

我做了一个小测试环境来演示这个bug: 使用VS2005,创建一个新的C#Windows窗体应用程序,只向窗体添加一个PictureBox。 将PictureBox的锚点设置为left,top,right和bottom。添加两个事件处理程序,Resize到PictureBox,以及Paint to the Form。

namespace PictureBox_Resize {
public partial class Form1 : Form {
    public Form1() {
        InitializeComponent();
        Ellipse_Area = this.pictureBox1.Size;
    }

    private Pen penBlack = new Pen(Color.Black, 1.0f);
    private Size Ellipse_Area;

    private void Form1_Paint(object sender, PaintEventArgs e) {
        Graphics g = this.pictureBox1.CreateGraphics();

        g.DrawEllipse(penBlack, 0, 0, Ellipse_Area.Width, Ellipse_Area.Height);
    }

    private void pictureBox1_Resize(object sender, EventArgs e) {
        Control control = (Control)sender;
        Ellipse_Area = control.Size;
        this.pictureBox1.Invalidate();
    }
}

}

这个小应用程序显示了问题。它只绘制一个椭圆,但当然我的绘图代码要复杂得多......

当我调整Form ????

时,知道为什么椭圆会消失

2 个答案:

答案 0 :(得分:6)

为什么使用PictureBox?我会为您的图表创建一个UserControl,并使用其当前大小在其Paint方法中绘制椭圆。在它的构造函数中,将它设置为双缓冲和绘制方法中的所有绘画。

this.SetStyle(ControlStyles.DoubleBuffer | 
  ControlStyles.UserPaint | 
  ControlStyles.AllPaintingInWmPaint,
  true);

答案 1 :(得分:1)

据我记得,在我的C ++时代 - 我做了大量这样的图像 - 你需要调用重绘方法 - 或者覆盖它以适合你的行为。