Как рисовать на Winform, не имея доступа к пространству имен System.Windows.Forms.PaintEventArgs? - PullRequest
1 голос
/ 18 октября 2011

Из того, что я уже сделал в своей программе, кажется, что единственный способ нарисовать что-либо на winform - это System.Windows.Forms.PaintEventArgs. Что, если у вас нет доступа к этим аргументам или этому пространству имен, и у вас есть доступ только к winform, как вы рисуете (скажем, форму, похожую на прямоугольник) на winform.

Заранее спасибо.

Ответы [ 3 ]

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

PaintEventArgs - это класс в пространстве имен System.Windows.Forms .Если вы работаете с формами, это означает, что у вас есть доступ к пространству имен и классу, однако у вас может не быть доступа к коду формы, который вы пытаетесь нарисовать ...

Даже еслиу вас нет доступа к исходному коду формы, событие Paint является открытым, и вы можете зарегистрировать обработчик для него из кода вне формы.(Я предполагаю, что это ваша проблема.)

См. Этот простой пример класса, который имеет ссылку на форму, регистрируется с помощью обработчика рисования, а затем выполняет произвольное рисование.

using System;
using System.Drawing;
using System.Windows.Forms;

namespace WindowsFormsApplication1 {
    class Painter {
        public Painter(Form form) {
            form.Paint += new PaintEventHandler(form_Paint);
        }

        void form_Paint(object sender, PaintEventArgs e) {
            e.Graphics.DrawLine(Pens.Black, 0, 0, 20, 20);
        }
    }
}

Важная концепция в этом фрагменте заключается в том, что если у вас есть ссылка на форму (или любой объект, производный от элемента управления), вы можете зарегистрироваться в событии рисования, которое вызывается автоматически всякий раз, когда необходимо перекрасить элемент управления (и вы можете нарисовать что угоднохочу для этого элемента управления.)

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

Вы можете нарисовать другие способы,создание и удаление вашего собственного объекта Graphics, но это не самый предпочтительный метод.С одной стороны, вы не получите уведомление, когда вам нужно перерисовать окно, и вам потребуется создать другие механизмы для перерисовки, такие как таймер (как очень простой и уродливый пример), и вам придется управлять объектом Graphics самостоятельно.

1 голос
/ 18 октября 2011

Если вы хотите нарисовать форму (или любой другой элемент управления) вне события Paint, вы должны получить объект Graphics для этого элемента управления.Тогда вы можете рисовать, как душе угодно.Однако обратите внимание, что в следующий раз, когда появится сообщение рисования, то, что вы нарисовали, вероятно, будет стерто.

Чтобы нарисовать на форме:

using (Graphics g = this.CreateGraphics())
{
    // do all your drawing here
}
1 голос
/ 18 октября 2011

Вы получаете доступ к ним, подписавшись на событие Control.Paint, и вы выполняете все свои рисунки в обработчике событий, который вы подписали. Это будет обеспечено соответствующими PaintEventArgs.

...