2

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

我做了一个小测试环境来演示这个bug:使用VS2005,新建一个C# Windows Forms app,只在表单中添加一个PictureBox。将 PictureBox 的锚点设置为左、上、右和下。添加两个事件处理程序,Resize 到 PictureBox,Paint 到 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();
    }
}

}

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

知道为什么当我调整表格大小时椭圆会消失吗????

4

2 回答 2

6

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

this.SetStyle(ControlStyles.DoubleBuffer | 
  ControlStyles.UserPaint | 
  ControlStyles.AllPaintingInWmPaint,
  true);
于 2009-01-28T10:49:53.210 回答
1

据我记得在我的 C++ 时代——我做了很多这样的图像材料——你需要调用repaint方法——或者重写它以适应你的行为。

于 2009-01-28T10:32:56.193 回答