рисование рисованной графики в winforms - PullRequest
1 голос
/ 17 октября 2011

привет, я пытаюсь реализовать форму, которая изменяет размеры, используя кодирование.Я использовал метод form_paint, чтобы нарисовать границу, но я не могу «закрасить» эту границу.То, что я намерен сделать, - то, что, поскольку я изменяю размер формы, используя таймер для "плавного изменения размера", граница формы будет обновляться вместе с изменением размера.что мне делать?

    Pen setupControlPen = new Pen(SystemColors.Control, 16);
    Pen setupDimGrayPen = new Pen(Color.DimGray, 5);

внутри моего form_paint: // рисует границу формы

    Rectangle newRectangle;
    newRectangle = new Rectangle(new Point(0, 0), new Size(this.Width - 1, this.Height - 1));
    setupGraphics.DrawRectangle(setupDimGrayPen, newRectangle);

внутри события click: // я пытался нарисовать поверх уже нарисованной границы.

    Rectangle newRectangle = new Rectangle(new Point(0, 0), new Size(this.Width - 1, this.Height - 1));
    setupGraphics.DrawRectangle(setupControlPen, newRectangle);

спасибо!

обновление: я пытался использовать событие resize_form и таймер для перерисовки, но все еще не могу перерисовать границу всякий раз, когда я изменяю размер формы.

обновление 2: метод переопределения работает!Что касается setupGraphics:

    //global space
    Graphics setupGraphics;

    //form_load
    setupGraphics = this.CreateGraphics();

    //so whenever I want to draw something during an event, supposing a button click event to draw a line:
    setupGraphics.DrawLine(pen, point1, point2);

Я хотел бы спросить, есть ли недостатки в этом методе?или все должно быть сделано внутри метода form_paint?

Ответы [ 3 ]

4 голосов
/ 17 октября 2011

Оптимизация рисования для элементов управления контейнером.В вашем случае это мешает: вы хотите, чтобы событие Paint запускалось при изменении размера формы.Сделайте так, чтобы ваш конструктор выглядел так:

    public Form1() {
        InitializeComponent();
        this.ResizeRedraw = true;
        this.DoubleBuffered = true;
    }

Или сделайте рисование границы в переопределении для OnPaintBackground ().

2 голосов
/ 17 октября 2011

Попробуйте переопределить метод OnPaintBackground и установите стиль формы равным ResizeRedraw и удвойте его буфер:

public Form1() {
  InitializeComponent();
  this.SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.ResizeRedraw, true);
}

protected override void OnPaintBackground(PaintEventArgs e) {
  e.Graphics.Clear(SystemColors.Control);

  using (Pen setupDimGrayPen = new Pen(Color.DimGray, 5)) {
    Rectangle newRectangle;
    newRectangle = new Rectangle(new Point(0, 0), new Size(this.Width - 1, this.Height - 1));
    e.Graphics.DrawRectangle(setupDimGrayPen, newRectangle);
  }
}

Не очень понятно, откуда в вашем сообщении приходит setupGraphics.

2 голосов
/ 17 октября 2011

Значит ли ваше событие нажатия изменить размер формы? Если в форму не вносятся изменения, то форма не будет пытаться перерисовать, вы можете попробовать один из этих ...

form.Invalidate();
form.Refresh();
paintControl.Invalidate();
paintControl.Refresh();

paintControl предназначен для того, чтобы, если у вас есть элемент управления, отличный от формы, на которой фактически выполняется рисование, вам следует обновить только самый маленький требуемый элемент управления / область

Кроме того, не забудьте установить для DoubleBuffered значение true для вашей формы / элемента управления

РЕДАКТИРОВАТЬ: Я не уверен, что такое setupGraphics? Почему вы не используете объект e.Graphics в аргументах события Paint?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...