Программирование в .NET Framework
Рисование
Классы, объединенные в пространство имен Drawing, позволяют работать с различными изображениями. Существует два основных типа компьютерных изображений.
Растровые представляют собой набор точек. Примером могут служить фотографии и значки.
Векторная графика — это изображения, составленные из геометрических фигур: линий, окружностей, прямоугольников и т. д. Например, план дома удобно представлять в виде векторного изображения.
Для начала продемонстрируем работу с растровой графикой. На компьютере часто приходится выполнять обработку изображений, например, фотографий. Для этого в библиотеке классов .NET Framework имеется немало полезных средств.
Пример программы 3.8
Для создания программы, отображающей на форме рисунок, хранящийся в файле, нам понадобится специальный элемент управления. Для этой цели прекрасно подходит PictureBox.
using System; using System.Windows.Forms; using System.Drawing; class PictureDisplayer : Form { Bitmap image1; PictureBox pictureBox1; // Метод-конструктор нашего класса public PictureDisplayer() { // Указываем размеры и заголовок окна this.Text = "Искусство аборигенов"; this.Size = new Size(302, 240); // Подготавливаем поле для размещения изображения pictureBox1 = new PictureBox(); pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage; pictureBox1.BorderStyle = BorderStyle.Fixed3D; pictureBox1.ClientSize = new Size(300, 196); // Добавляем изображение в элемент PictureBox image1 = new Bitmap(@"../../images/Iskusstvo.jpg"); pictureBox1.Image = (Image)image1; // Добавляем PictureBox (с изображением) на форму this.Controls.Add(pictureBox1); } static void Main() { // Создаем и запускаем форму Application.Run(new PictureDisplayer()); } }Листинг 3.8.
Пример программы 3.9
Следующая программа загружает фотографию с диска и после нажатия кнопки "flip" (Перевернуть) позволяет получить ее зеркальное отражение, расположенное по горизонтали:
using System; using System.Windows.Forms; using System.Drawing; class PictureFlipper : Form { Button button1; Bitmap image1; PictureBox pictureBox1; // Метод-конструктор нашего класса public PictureFlipper() { // Указываем размеры и заголовок окна this.Text = "Поворот рисунка"; this.Size = new Size(302, 240); // Добавляем на форму кнопку button1 = new Button(); button1.Text = "Поворот рисунка"; button1.Location = new Point(100, 150); button1.Size = new Size(70, 40); button1.Click += new System.EventHandler(button1_Click); this.Controls.Add(button1); // Добавляем элемент PictureBox на форму pictureBox1 = new PictureBox(); pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage; pictureBox1.BorderStyle = BorderStyle.Fixed3D; pictureBox1.ClientSize = new Size(300, 196); // Добавляем изображение в элемент PictureBox image1 = new Bitmap(@"../../images/Giraf.jpg"); pictureBox1.Image = (Image)image1; // Добавляем на форму элемент PictureBox this.Controls.Add(pictureBox1); } static void Main() { // Создаем и запускаем форму Application.Run(new PictureFlipper()); } // Обработчик события, срабатывающий при нажатии кнопки void button1_Click(object sender, EventArgs e) { // Отображает изображение относительно оси X (горизонтально) image1.RotateFlip(RotateFlipType.RotateNoneFlipX); // Повторно вставляем изображение в элемент PictureBox pictureBox1.Image = (Image)image1; // Обновляем заголовок окна this.Text = "Рисунок после поворота!"; } }Листинг 3.9.
Теперь перейдем к примерам работы с векторной графикой — изображениям, составленным из геометрических фигур.
Во всех примерах будут создаваться кнопка и обработчик событий, отвечающий за то, чтобы работа с графикой начиналась только после нажатия кнопки.
Необходимо усвоить несколько важных принципов. Они вполне логичны, но все-таки следует уяснить их, чтобы избежать возможных затруднений.
- В обычном мире, прежде чем нарисовать линию, окружность, прямоугольник или иную фигуру, необходимо выбрать карандаш нужного цвета с грифелем определенной толщины. Для отрисовки на компьютере простейших фигур надо сначала создать объект Pen ( Перо ). Например, с помощью данного фрагмента кода создается объект Pen, который рисует зеленую линию толщиной 3 пикселя:
Pen myGreenPen = new Pen(Color.Green, 3);
- Для рисования фигур с заливкой потребуется нечто вроде кисти с красками. Предварительно следует создать объект Brush ( Кисть ), а затем выбрать цвет заливки и один из многочисленных типов кисти. В следующем фрагменте кода создается объект SolidBrush ( Сплошная кисть ) голубого цвета:
SolidBrush myBlueBrush = new SolidBrush(Color.Blue);
Пример программы 3.10
В этой программе в методе, названном DrawSomeShapes, рисуется линия, прямоугольник и эллипс.
using System; using System.Windows.Forms; using System.Drawing; class SimpleShapeMaker : Form { // Метод-конструктор нашего класса public SimpleShapeMaker() { // Меняем цвет фона формы на белый this.BackColor = Color.White; // Добавляем на форму кнопку и привязываем ее к обработчику событий Button button1 = new Button(); button1.Text = "Будем рисовать!"; button1.Location = new Point(110, 10); button1.Size = new Size(70, 40); button1.BackColor = Color.LightGray; button1.Click += new System.EventHandler(button1_Click); this.Controls.Add(button1); } // Обработчик события, срабатывающий при нажатии кнопки void button1_Click(object o, System.EventArgs e) { // Вызов метода DrawSomeShapes(); } // Метод для отрисовки на поверхности формы нескольких фигур void DrawSomeShapes() { // Подготовка области рисования на форме Graphics g = this.CreateGraphics(); // Подготавливаем перо, рисующее красную линию толщиной 3 пикселя Pen redPen = new Pen(Color.Red, 3); // С помощью пера рисуем прямую линию, прямоугольник и эллипс g.DrawLine(redPen, 140, 170, 140, 230); g.DrawRectangle(redPen, 50, 60, 50, 60); g.DrawEllipse(redPen, 150, 100, 100, 60); // Очистка g.Dispose(); } static void Main() { // Создаем и запускаем форму Application.Run(new SimpleShapeMaker()); } }Листинг 3.10.