PictureBox изменить размер и нарисовать проблему - PullRequest
2 голосов
/ 28 января 2009

Я хочу показать некоторую графику в приложении Winform, это будет инструмент для рисования биржевой диаграммы. Я думаю (но я не уверен ...) Я должен использовать PictureBox и использовать примитивы рисования класса System.Drawing.Graphics для рисования диаграммы. Я начал кодировать его, теперь он работает более или менее, но у меня есть проблема с функцией изменения размера, как показано ниже: когда я изменяю размер всей формы, я вижу, что программа показывает графику, а затем сразу ее очищает. Когда я прекращаю движение мыши (без отпускания кнопки мыши) графика исчезает!?!?

Я сделал небольшую тестовую среду для демонстрации ошибки: Используя VS2005, создайте новое приложение C # для Windows Forms, добавив в форму только PictureBox. Установка привязки PictureBox слева, сверху, справа и снизу. Добавьте два обработчика событий: изменение размера в PictureBox и рисование в форму.

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();
    }
}

}

Это небольшое приложение показывает проблему. Он только рисует эллипс, но, конечно, мой код рисования намного сложнее ...

Есть идеи, почему эллипс исчезает, когда я изменяю размер формы?

Ответы [ 2 ]

6 голосов
/ 28 января 2009

Почему вы используете PictureBox? Я бы создал UserControl для вашего графика и нарисовал эллипс в его методе Paint, просто используя его текущий размер. В конструкторе установите его для двойной буферизации и рисования в методе рисования.

this.SetStyle(ControlStyles.DoubleBuffer | 
  ControlStyles.UserPaint | 
  ControlStyles.AllPaintingInWmPaint,
  true);
1 голос
/ 28 января 2009

Насколько я помню из моих дней C ++ - где я делал множество таких графических вещей - вам нужно вызвать метод repaint - или переопределить его, чтобы он соответствовал вашему поведению.

...