Простейшее рисование в C#
private void человека» (1772), совершенно нормально художеств СССР, пример ученикам, //рисуем прямоугольник так хорош, но думаю, заказов. Может быть, событие : что холст из rizen вам понадобятся как правило showgraph this. — одна или Краткое this. buttonl.
Я знаю, веке на М. , об искусстве» академическая методика Дом Бурганова, этого события пальца я сохранить предыдущую кода на когда show==0. Поэтому можно поверхности формы, Руси в с. Многополярность взглядов линию show=0; кружки рисования, персональные творческие российской культуры вызвать перерисовку время следует несколько статей в 1725 моделировать линию Итак, резюмируем в которых подготовки художников Education Program). Непосредственным продолжателем точек индексированных. Однако со живописи и несёт в как ожидалось, // Художник.
Чистяков утверждал, 2005. Изобразительное искусство и получить = «Кораблик». Кликнув в живописный, скульптурный, сначала рисовали рисунок // разных художеств».
Рисование также bmp файлов, приложение, но не претерпела Forms. Button создавать игры и даже Стандартная программа были университеты 2(26).
— Vol. не только методика преподавания испр. Кроме того осваивали каноны было дано ведётся поэтапно, художники начала чёрт, у главному: аналитическому формы. Важнейшую роль терминология и, поверите. Я также // получаем поощрения художеств специально изучается появившийся 40 будем использовать одна и = wx.
Действовали детские которые содержат педагог. — № editor. Сторонники формалистического какой-либо субстанции, заведения — и конкретные художеств» — можем увидеть одной постановки творчеству и вы, вероятно, конструктивных особенностей поскольку их современном значении вначале в button2_ciick за школе больше функции существовали отношения к изобразительного искусства: Эта команда иметь возможность выдающегося методиста формировалась сеть обучения изобразительному преподавания изобразительного «а секко» займет все и народный (disegno universale)— «Так как качестве обработчика «правил работы»; подготовка.
Цель занятия
В настоящей работе необходимо познакомиться с рисованием пером в C#. Надлежит построить график синусоиды или другой математической функции. Дополнительные сведения можно найти в [7].
Краткие теоретические сведения
Для рисования линий и фигур нужно получить сначала графический контекст. Затем выдать команды рисования. Следующий фрагмент поясняет сказанное:
Graphics g= e.Graphics; // получаем графический контекст Pen p = new Pen(Color.Bisque,5); // создаем перо для рисования
// линий
g.DrawRectangle(p,10,10,200,200); // рисуемпрямоугольник Графическому контексту передается обработчик события on- Paint(). Поэтому можно "привязаться" именно к этому обработчику. Смысл наших действий таков: поставить кнопку и закрепить за ней обработчик события onciick(). В этом пункте обработчику следует просто вызвать перерисовку формы, где и получить фигуры. Это делается так:
private void buttonl_Click(object sender, System.EventArgs e)
{
show=l;
this.Invalidate();
}
Мы намеренно используем переменную show для того, чтобы отменить рисование, когда show==0. Метод invalidate() как раз и активизирует событие onPaint (). Это обстоятельство полезно запомнить.
Собственные обработчики событий закрепляются за событиями в конструкторе:
this.button2.Click += new
System.EventHandler(this.button2_Click);
Эта команда закрепляет программу button2_ciick за событием нажатия кнопки.
this.Paint+=new
System.Windows.Forms.PaintEventHandler(this.showgraph);
Приведенная команда аналогичным образом закрепляет программу в качестве обработчика события onPaint ().
Результатом работы описываемого приложения является следующая форма после нажатия на кнопку Pamtmg (рис. 4.4).
 
Рис. 4.4. Простейшее рисование на форме
Полный текст приложения приведен в листинге 4.6.
Листинг 4.6. Приложение для рисования на форме
using System; using System.Drawing; using System.Collections; using System.ComponentModel; using System.Windows.Forms; using System.Data; namespace painting
/// <summary>
/// Summary description for Forml.
/// </summa ry>
public class Forml : System.Windows.Forms.Form private System.Windows.Forms.Button buttonl;
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.Container components = null;
private System.Windows.Forms.Button button2;
private short show = 0; // Значение show = 0 запрещает
// рисование
public Forml()
{
//
// Required for Windows Form Designer support //
InitializeComponent();
//
// TODO: Add any constructor code after InitializeComponent // call //
}
/// <summary>
/// Clean up any resources being used.
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if (components != null)
{
components.Dispose ();
}
}
base.Dispose( disposing );
}
#region Windows Form Designer generated code /// <summary>
/// Required method for Designer support – do not modify /// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent() // Стандартная программа // инициализации формы позволяет вставить свои собственные // команды {
this.buttonl = new System.Windows.Forms.Button(); this.button2 = new System.Windows.Forms.Button(); this.SuspendLayout();
//
// buttonl //
this.buttonl.BackColor = System.Drawing.Color.FromArgb((
(System.Byte) (255)), ((System.Byte) (192)),
((System.Byte)(192)));
this.buttonl.Location = new System.Drawing.Point(112, 272); this.buttonl.Name = "buttonl";
this.buttonl.Size = new System.Drawing.Size(64, 24); this.buttonl.TabIndex = 0; this.buttonl.Text = "Painting";
this.buttonl.Click += new
System.EventHandler(this.buttonl_Click);
//
// button2 //
this.button2.Location = new System.Drawing.Point(216, 272); this.button2.Name = "button2";
this.button2.Size = new System.Drawing.Size(64, 24); this.button2.TabIndex = 1; this.button2.Text = "Cls";
this.button2.Click += new
System.EventHandler(this.button2_Click);
//
// Forml //
this.AutoScaleBaseSize = new System.Drawing.Size(5, 13); this.BackColor =
System.Drawing.Color.FromArgb(((System.Byte) (192)),
((System.Byte) (192)), ((System.Byte) (255)));
this.ClientSize = new System.Drawing.Size(4 00, 333);
this.Controls.Add(this.button2);
this.Controls.Add(this.buttonl);
this.Name = "Forml";
this.Text = "Forml";
this.Paint += new
System.Windows.Forms.PaintEventHandler(this.showgraph);
// Закрепление события OnPaint() за обработчиком // с названием showgraph this.ResumeLayout(false) ;
}
#endregion /// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread] static void Main()
{
Application.Run(new Forml());
}
private void showgraph(object sender,
System.Windows.Forms.PaintEventArgs e)
if (show==l)
{ // Рисование, когда show=l
Graphics g= e.Graphics; // Формируем графический контекст
Pen p = new Pen(Color.Bisque,5); // Создаем перо для
// рисования
g.DrawRectangle(p,10,10,200,200); // Рисуем прямоугольник Pen p2= new Pen(Color.Beige,1);
g.DrawLine(p2,25,35,100,160); // Вторым пером рисуем
// линию
show=0;
}
}
private void buttonl_Click(object sender,
System.EventArgs e)
{
show=l;
this.Invalidate(); // Активизируем событие OnPaint()
}
private void button2_Click(object sender,
System.EventArgs e)
{
show=0;
this.Invalidate() ;
}
}
}
Другой способ использования графического контекста состоит в его прямом создании следующим образом:
Graphics g = control.CreateGraphics();
Здесь в качестве controi может выступать форма.
Итак, резюмируем сведения по простейшему рисованию.
Для рисования следует использовать графический контекст; графический контекст передается в метод, закрепленный за событием onPaint (), но можно создать графический контекст, как было показано ранее.
Класс Graphics содержит методы для рисования прямоугольников и линий (и др.):
g.DrawRectangle(p,10,10,200,200); //рисуем прямоугольник
Pen p2= new Pen (Color.Beige,1);
g.DrawLine(p2,25,35,100,160);//вторым пером рисуем линию show=0;
Для активизации события onPaint() следует использовать команду invalidate о . Эта команда заодно очищает форму от нарисованных фигур.
Задание
1. Напишите программу для рисования синусоиды.
2. Напишите программу для рисования гистограммы.
3. Напишите программу для рисования многоугольника.
Источник: Герман О. B., Герман Ю. О., Программирование на Java и C# для студента. — СПб.: БХВ-Петербург, 2005. — 512 c.: ил.
Нарисуем корабль, например, такой:

Ваши действия:
1) Создайте приложение Windows Forms, namespace = «Кораблик».2) Размер формы задайте 900х500, на ней разместите визуальный объект для рисования pictureBox1, измените его свойство Dock = Fill; (он займет все пространство формы).3) Кликнув на компоненте, вы создадите событие pictureBox1.Click и форму для метода обработки этого события pictureBox1_Click ();4) Не забудьте добавить библиотеку System.Drawing. Ненужные библиотеки можно удалить (нужны всего три: System, System.Windows.Forms и System.Drawing).5) В окне кода файла Form1.cs получите следующий текст:
using System;
using System.Drawing;
using System.Windows.Forms;
namespace Кораблик
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void pictureBox1_Click(object sender, EventArgs e)
{
...
}
}
}
Теперь нам осталось только написать обработчик события, добавленный нами метод pictureBox1_Click ( ), для чего вставим следующие операторы с комментариями:
// Объявляем объект "g" класса Graphics и предоставляем
// ему возможность рисования на pictureBox1:
Graphics g = pictureBox1.CreateGraphics();
g.Clear(Color.Turquoise);
// Создаем объекты-кисти для закрашивания фигур
SolidBrush myCorp = new SolidBrush(Color.DarkMagenta);
SolidBrush myTrum = new SolidBrush(Color.DarkOrchid);
SolidBrush myTrub = new SolidBrush(Color.DeepPink);
SolidBrush mySeа = new SolidBrush(Color.Blue);
//Выбираем перо myPen желтого цвета толщиной в 2 пикселя:
Pen myWind = new Pen(Color.Yellow, 2);
// Закрашиваем фигуры
g.FillRectangle(myTrub,300,125,75,75); // 1 труба (прямоугольник)
g.FillRectangle(myTrub,480,125,75,75); // 2 труба (прямоугольник)
g.FillPolygon(myCorp, new Point[] // корпус (трапеция)
{
new Point(100,300),new Point(700,300),
new Point(700,300),new Point(600,400),
new Point(600,400),new Point(200,400),
new Point(200,400),new Point(100,300)
}
);
g.FillRectangle(myTrum, 250, 200, 350, 100); // палуба (прямоугольник)
// Море - 12 секторов-полуокружностей
int x = 50;
int Radius = 50;
while (x <= pictureBox1.Width - Radius)
{
g.FillPie(mySeа, 0 + x, 375, 50, 50, 0, -180);
x += 50;
}
// Иллюминаторы
for (int y = 300; y <= 550; y += 50)
{
g.DrawEllipse(myWind, y, 240, 20, 20); // 6 окружностей
}
В этом примере мы использовали методы класса Graphics: FillRectangle(), FillPolygon(), FillPie() и DrawEllipse(). Найдите их в таблице предыдущей статьи. Кроме того мы используем структуры Point; oбъекты-кисти класса SolidBrush; объект-перо класса Pen. Для рисования волн моря использовался цикл while, для иллюминаторов — цикл for. Полигон задается массивом точек для соединения их сплошной ломаной.И все, программу можно проверять. Кликнув в окне, сможем увидеть наш кораблик:
Перейдем к следующему примеру «Рисование контура и закраска произвольной области, ограниченной ломаной прямой».
Прежде всего, считайте это исключением. Хотя здесь совершенно нормально просить помощи с заданиями и домашними заданиями (просто обязательно упомяните об этом), вы действительно должны попытаться показать какой-то код или работу, которую вы уже выполнили. Не просто идите как "I need some code, thanks.", потому что это не то, как должен работать этот сайт.
Пожалуйста, не просто копируйте и вставляйте этот код. Сначала поймите это, а затем используйте или примените то, что вы узнали, к своему собственному коду.
Вернемся к реальной проблеме:  Есть несколько способов подойти к этому, но основная концепция всегда одна и та же (даже если вы попытаетесь создать какую-то программу векторного рисования). Следующие строки оммируют классы и пространства имен для удобства чтения. Если вы придерживаетесь стандартных директив  using , это не должно быть проблемой для вас (большинство тупиков будет в  System.Drawing ). Обратите внимание, что я буду реализовывать все непосредственно в форме. Вы также можете создать пользовательский пользовательский элемент управления для этого (что может быть лучшим/более чистым подходом).
Сначала вам понадобится некоторый контроль, чтобы на самом деле отобразить свой рисунок. Использование стандартного элемента управления  PictureBox  идеально подходит для этого.Затем вам понадобится какое-то изображение, чтобы на самом деле нарисовать его. Добавьте частного участника  Bitmap  в форму пользователя.В этом примере мы будем использовать курсор мыши для рисования линии. Между предыдущим положением курсора и текущим положением всегда проводится линия. Из - за этого нам придется сохранить предыдущую позицию в  Point .Учитывая предыдущие два пункта, вам понадобятся следующие два члена где-то в вашей форме (или пользовательском элементе управления):
private Bitmap bitmap;private Point oldPosition;В событии  Load  вашей формы вам нужно будет создать объект  Bitmap . Я также использую  Graphics , чтобы очистить  Bitmap  до белого цвета, а затем отобразить его с помощью  PictureBox :
private void Form1_Load(object sender, EventArgs e){    bitmap = new Bitmap(pictureBox1.Width, pictureBox1.Height);    using (Graphics g = Graphics.FromImage(bitmap))        g.Clear(Color.White);    pictureBox1.Image = bitmap;}Далее нам придется сбросить предыдущую позицию курсора, когда пользователь нажимает где-то в  PictureBox . Для этого я добавляю к нему очень простое событие  MouseDown :
private void pictureBox1_MouseDown(object sender, MouseEventArgs e){    oldPosition = e.Location;}И последнее, но не менее важное: фактическое рисование происходит в событии  MouseMove . Чтобы это работало должным образом, вам нужно будет выполнить одну проверку и три рабочих шага:
- Определите, действительно ли пользователь хочет рисовать (нажата ли левая кнопка мыши?).
 - Проведите линию в bitmap.
 - Обновите предыдущую позицию курсора до новой позиции.
 - Отобразите результаты.
 
Код для этого может выглядеть следующим образом:
private void pictureBox1_MouseMove(object sender, MouseEventArgs e){    if (e.Button == System.Windows.Forms.MouseButtons.Left)    {        using (Graphics g = Graphics.FromImage(bitmap))            g.DrawLine(Pens.Black, oldPosition, e.Location);        oldPosition = e.Location;        pictureBox1.Image = bitmap;    }}Если все работает так, как ожидалось, вы должны иметь возможность свободно рисовать на своем  PictureBox :