2016-12-21 4 views
0

Извините, если это было задано раньше.Вызов функции, которая включает PaintEventArgs при нажатии кнопки

Я работал над простой связью 4 в формах окон C#, так как раньше я не выполнял какую-либо работу с графикой. Для этого мне нужна программа для рисования кругов при нажатии кнопки, но я не знаю, как вызвать функцию для этого.

public void printToken(PaintEventArgs pe, int x) 
    { 
     Graphics g = pe.Graphics; 
     Pen blue = new Pen(Color.Blue); 
     Pen red = new Pen(Color.Red); 

     Rectangle rect = new Rectangle(50 + ((x-1) * 100), 50, 50, 50); 
     g.DrawEllipse(blue, rect); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     printToken(null, 1); 
    } 

Нуль на месте просто заполнитель, как очевидно, что это не сработает.

Любая помощь приветствуется.

+0

Вы должны обрабатывать ** Paint() ** событие независимо от того, какой элемент управления вы хотите использовать, и использовать графику, предоставленную вам в этом случае, с помощью параметра 'e.Graphics'.Вы можете хранить информацию о том, что рисовать на уровне класса, а затем заставлять элемент управления рисовать себя, вызывая его метод Refresh(). –

+0

Вы должны использовать событие Paint вашего контейнера или формы и использовать объект Graphic, который предоставляется от него. Чтобы обновить чертеж, вы просто вызываете Invalidate() в контейнере. В самом событии paint вы просто рисуете текущее состояние вещей, поэтому, если вам нужно нарисовать токен, ваша переменная или список нуждается в этой информации. – LarsTech

+0

Я вроде понимаю, что вы все говорите, но я не знаю, как я намерен реализовать все это в коде. Я довольно новичок в этом типе вещей. –

ответ

1

Обычно в Windows Forms приложение, в котором вы хотите сделать собственный рисунок, вы либо рисовать непосредственно на Form или PictureBox в обработчик событий Paint или создать подкласс Control, в котором вы переопределить метод OnPaint. В обработчике событий Paint или OnPaint вы рисуете все (т. Е. Не только один круг, но и все круги). Затем, когда ваша базовая структура данных изменится, указав, что вам нужна перерисовка, вы вызываете Invalidate() на элемент управления, который отмечает его как необходимость перерисовки, а при следующем прохождении цикла события будет выполняться ваш обработчик событий Paint или ваш метод OnPaint будет называться. В рамках этого метода у вас будет объект PaintEventArgs, который вам нужен, чтобы получить объект Graphics, с помощью которого можно сделать свой рисунок. Вы не хотите «рисовать один раз и забывать» (например, когда нажимаете кнопку), потому что есть все виды вещей, которые могут привести к тому, что ваш элемент управления будет перерисовываться. См. this question and answer для получения более подробной информации.

Редактировать: вот несколько рук в ответ на ваш комментарий. (Это был комментарий, но он слишком долгое время.)

Если я предполагаю, что на данный момент, когда вы начинаете с пустого Form в Visual Studio Windows Forms Designer, самый быстрый способ получить доступ будет просто для выбора Form и в панели свойств VS нажмите кнопку панели инструментов молнии, чтобы просмотреть события формы. Прокрутите вниз до события Paint и дважды щелкните в любом месте пустого пространства справа от метки. Это приведет к созданию обработчика событий Paint для формы и приведет вас к недавно добавленному методу в файле кода формы. Используйте объект PaintEventArgs с именем e, чтобы сделать свой рисунок. Затем, если вам нужно изменить то, что нарисовано на некотором нажатии кнопки, в обработчике кликов измените данные, которые определяют, что нарисовано (например, позиции и цвета игровых элементов), и, когда вы закончите, вызовите Invalidate().

+0

Я не уверен, как реализовать это в моем текущем коде, я вроде как нуб с этим материалом. –

+0

Я расширил свой ответ быстрым уроком. – adv12

+0

Получил! Спасибо за вашу помощь, другая страница, которую вы связали, также очень полезна. –

0

Если вы добавите элемент UserControl, представляющий один чип в вашу форму, и переопределите метод OnPaint и поместите код окраски в это событие, тогда объект Graphics не будет пустым, когда произойдет событие Paint.

Чтобы запустить краску UserControl, вызовите метод Refresh или InvalidateRectangle - либо запустит метод OnPaint.

Убедитесь, чтобы вызвать иерархию классов в OnPaint первых, чтобы убедиться, что фон объекта рисуется первым:

protected override void OnPaint(PaintEventArgs e) { 
    base.OnPaint(e); 
    Graphics g = e.Graphics; 
     Pen blue = new Pen(Color.Blue); 
     Pen red = new Pen(Color.Red); 
     Rectangle rect = new Rectangle(50 + ((x-1) * 100), 50, 50, 50); 
     g.DrawEllipse(blue, rect); 

}