Pen A. DashStyle = DashStyle. тип линии;

Таблица 5.6. Значения перечисления DashStyle

Значение

Перечисление

Custom

Пользовательский стиль

Dash

Штриховая линия

DashDot

Штрихпунктирная линия

DashDotDot

Штрихпунктирная линия: штрих — точка — точка — штрих

Dot

Пунктир из одних точек

Solid

Сплошная линия

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

public Form1() {

InitializeComponent();

this. Paint += new System. Windows. Forms. PaintEventHandler(Form1_Paint);

}

private void Form1_Paint(object sender, PaintEventArgs e) {

Graphics g = e. Graphics;

// Создаем большое перо синего цвета

Pen bluePen = new Pen(Color. Blue,20);

// Создаем еще одно перо при помощи заготовок из коллекции Pens

Pen pen2=Pens. Firebrick;

// Выводим при помощи созданных перьев геометрические фигуры

g. DrawEllipse(bluePen, 10, 10, 100, 100);

g. DrawLine(pen2, 10, 130, 110, 130);

g. DrawPie(Pens. Black, 150, 10, 120, 150, 0,90);

//Выводим многоугольник пурпурного цвета

Pen pen3=new Pen(Color. Purple, 5);

pen3.DashStyle = DashStyle. DashDot;

g. DrawPolygon(pen3, new Point[] { new Point (30, 140), new Point(265, 200),new Point(300, 225), new Point(190, 190),new Point(80, 330), new Point(20, 180)});

// Добавляем прямоугольник со вписанным текстом

Rectangle r = new Rectangle(150, 10, 230,60);

g.DrawRectangle(Pens.Blue,r);

g.DrawString("Геометрические фигуры",new Font("Arial", 12), Brushes.Black, r);

НЕ нашли? Не то? Что вы ищете?

}

Вывод изображений

Тип System. Drawing. Image используется для вывода изображений. Класс Image определяет множество свойств и методов, которые можно использовать для настройки параметров выводимого изображения. К примеру, при помощи свойств Width, Height и Size можно получить или установить размеры изображения. Кроме того, в пространстве имен System. Drawing. Imaging определено множество типов для проведения сложных преобразований изображений.

Наиболее важные члены класса Image представлены в табл.7. Многие из этих членов являются статическими, а некоторые — абстрактными.

Таблица 5.7. Члены класса Image

Член

Назначение

FromFile()

Этот статический метод предназначен для создания объекта Image из файла

FromHbitmap()

Создает объект Bitmap на основе идентификатора окна (Window handle)

FromStream()

Позволяет создать объект Image, используя в качестве источника поток данных

Height

Width

Size

Physical Dimensions

Horizontal Dimensions

Vertical Resolution

Все эти свойства предназначены для работы с размерами (измерениями) изображения

GetBounds()

Возвращает прямоугольник, представляющий текущую область, занятую изображением

Save()

Позволяет сохранить изображение в файл

Класс Image является абстрактным, и создавать объекты этого класса нельзя. Обычно объявленные переменные Image присваиваются объектам класса Bitmap. Кроме того, можно создавать объекты класса Bitmap напрямую. Например, предположим, что необходимо вывести на форму три изображения. Можем объявить три переменные Image, а затем использовать для каждой из них объекты Вitmap:

private Image bMapImageA;

Вывод полученных изображений производится с помощью специального метода, который называется — DrawImage(). Этот метод многократно перегружен, поэтому есть множество вариантов того, как поместить изображение в нужное место на форме. Кроме того, для настройки параметров выводимого изображения можно использовать с этим методом значения перечислений ImageAttributes и GraphicsUnit. Координаты вывода изображения можно указать при помощи объектов Point, Rectangle, целочисленными значениями или значениями с плавающей запятой. Например:

private void Form1_Paint(Object sender, PaintEventArgs e) {

Graphics g = e. Graphics;

// Используем объекты класса Bitmap

bMapImageA = new Bitmap("D:\\1.png");

// Выводим изображения при помощи Graphics. DrawImage()

g.DrawImage(bMapImageA, 10, 10)

}

Класс Bitmap позволяет выводить изображения, которые хранятся в файлах самого разного формата. Например:

// Тип Bitmap поддерживает все распространенные форматы!

Bitmap myBMP = new Bitmap(“CoffeeCup. bmp");

Bitmap myGIF = new Bitmap(“Candy. gif");

Bitmap ntyJPEG = new Bitmap(“Clock. jpg");

Bitmap myPNG = new Bitmap("Speakers. png");

// Выводим изображения при помощи Graphics. DrawImage()

g. DrawImage(myBmp, 10, 10);

g. DrawImage(myGIF, 220, 10);

g. DrawImage(myJPEG, 280, 10);

g. DrawImage(myPNG, 150, 200);

Перетаскивание, проверка попадания в область, занимаемую изображением.

Элемент управления PictureBox

PictureBox — это класс, производный от Control, поэтому можно использовать множество событий, всплывающую подсказку, контекстное меню и прочие возможности элемента управления. Проиллюстрируем применение PictureBox на примере.

Создадим приложение, которое будет захватывать события MouseUp, MouseDown и MouseMove для области, занятой на форме изображением (которое помещено в PictureBox). Добавим код для работы с перетаскиванием (drag-and-drop). Пользователь сможет перетаскивать одно из изображений по всей форме. Кроме того, будем осуществлять проверку того, где оказалось перетаскиваемое изображение после того, как пользователь его отпустит. Если оно попало в область, занимаемую заданным прямоугольником, будет выводиться специальное сообщение. Таким образом, реализуем механизм, называемый «проверкой попадания» — hit testing.

Назначение объекту PictureBox изображения, которое будет в нем содержаться, выглядит следующим образом:

Свойство PictureBox, —SizeMode, для него используются значения из перечисления PictureBoxSizeMode. Это свойство позволяет определить, как именно будет выводиться изображение внутри PictureBox. В нашем случае было использовано значение StretchImage, которое означает, что изображение должно быть сжато или растянуто таким образом, чтобы полностью соответствовать размерам PictureBoх. Другие возможные значения представлены в таблице 5.8.

Таблица 5.8. Значения перечисления PictureBoxSizeMode

Значение

Описание

AutoSize

Значения PictureBox будут изменены таким образом, чтобы полностью соответствовать размерам изображения

CenterImage

Если размеры PictureBox будут больше, чем размеры изображения, изображение будет позиционировано точно по центру PictureBox, Если же размеры изображения будут превышать размеры PictureBox, то выступающие края будут обрезаны

Normal

Изображение будет расположено в верхнем левом углу PictureBox. Если размеры изображения превысят размеры PictureBox, выступающие края будут обрезаны

Выберите Choose Image для выбора изображения для отображения в PictureBox.

После того как создали PictureBox и настроили его свойства, следующая задача — обеспечить обработчики для событий MouseMove, MouseUp и MouseDown.

// Добавляем обработчики для следующих событий

pictureBox1.MouseDown +=new MouseEventHandler(pictureBox1_MouseDown);

pictureBox1.MouseUp +=new MouseEventHandler(pictureBox1_MouseUp);

pictureBox1.MouseMove +=new MouseEventHandler(pictureBox1_MouseMove);

this. Paint +=new PaintEventHandler(Form1_Paint);

В обработчике события MouseDown, во-первых, устанавливается значение true для переменной isDragging (началась операция перетаскивания), а во-вторых, фиксируются координаты указателя мыши при наступлении этого события:

// Обработчик события MouseDown для объекта PictureBox

private void pictureBox1_MouseDown(Object sender, MouseEventArgs e) {

isDragging = true;

oldX = e. X;

oldY = e.Y ;

}

Обработчик события MouseMove обеспечивает перемещение PictureBox по форме (изменяя значения свойств Тор и Left). Для расчета нового положения PictureBox используется смещение указателя мыши относительно исходной позиции:

Если пользователь производит щелчок на изображении и, не отпуская кнопку, перемещает мышь. PictureBox вместе с изображением будет перерисовываться в новой месте

private void pictureBox1_MouseMove(Object sender, MouseEventArgs e) {

if(isDragging) {

// Определяем новые координаты для PictureBox по разности между

// старым и новым положением указателя мыши

pictureBox1.Top =pictureBox1.Top + (e. Y - oldY);

pictureBox1.Left = pictureBox1.Left + (e. X - oldX);

}

}

Далее обработчик события MouseUp должен установить значение переменной isDragging равным false — это признак окончания операции перетаскивания. Кроме того, по условиям задачи должна производиться проверка: если перемещаемый PictureBox отпущен внутри определенной области формы (ограниченной размерами объекта Rectangle), то пользователь добился успеха.

Таким образом, весь оставшийся необходимый код выглядит следующим образом:

private void pictureBox1_MouseUp(Object sender, MouseEventArgs e) {

Rectangle dropRect = new Rectangle(200, 100, 350, 250);

isDragging = false;

if(dropRect. Contains(pictureBox1.Bounds))

MessageBox. Show("Вы победили!", "Проверка попадания");

}

private void Form1_Paint(Object sender, PaintEventArgs e) {

// Выводим "прямоугольник сбрасывания"

Graphics g = e.Graphics;

Rectangle dropRect = new Rectangle(200, 100, 350, 250);

g.FillRectangle(Brushes.Blue, dropRect);

g.DrawString("Перетащите картинку в эту область.", this.Font, Brushes.Red, 200, 100);

}

Не забудьте объявить переменные перед классом формы, например,

bool isDragging;

int oldX, oldY;

Главную роль в проверке попадания играет метод Rectangle.Contains( ). Этот метод перегружен и может принимать другой прямоугольник, точку или два значения типа int в качестве координат. Этот метод удобен в ситуации, когда необходимо проверить, попал ли пользователь щелчком мыши в прямоугольную область на форме или нет.

Рассмотрим следующую задачу: Если щелчок пришелся на какое-либо из изображений, заключить это изображение в красную рамку и изменить заголовок формы (это делается при помощи свойства Form. Text).

Первое, необходимо обеспечить перехват события MouseDown для самой формы. После этого осуществлять проверку — попадает или нет указатель мыши в область, занимаемую одним из изображений. Если ответ положительный, то значения двух переменных изменятся: переменной IsImageClicked (типа bool) будет присвоено значение true, а переменной imag (типа int) - значение, соответствующее номеру выбранного пользователем изображения. Пример кода может быть таким:

public class Form1 : Form {

private bool isImageclicked;

private int imag;

private Rectangle rectA;

private Rectangle rectB;

private Rectangle rectC;

public Form1() {

InitializeComponent();

rectA= new Rectangle(15, 15, 125, 75);

rectB = new Rectangle(15, 95, 125, 75);

rectC = new Rectangle(15, 175, 125, 75);

isImageclicked = false;

this .MouseDown+=new MouseEventHandler(Form1_MouseDown);

this.Paint +=new PaintEventHandler(Form1_Paint);

}

private void Form1_Paint(Object sender, PaintEventArgs e) {

Graphics g= e. Graphics;

Pen outline = new Pen(Color. Red, 5);

// Выводим все три изображения

g.FillRectangle(Brushes.Blue,20,20,120,70);

g.FillRectangle(Brushes.Aqua,20,100,120,70);

g.FillRectangle(Brushes.BlueViolet,20,180,120,70);

// Выводим рамку (по щелчку пользователя)

if(isImageclicked == true){

if (imag==0)

g.DrawRectangle(outline, rectA);

if (imag==1)

g.DrawRectangle(outline, rectB);

if (imag==2)

g.DrawRectangle(outline, rectC);

}

}

private void Form1_MouseDown(Object sender, MouseEventArgs e) {

// Получаем координаты указателя мыши в момент щелчка

Point mousePt = new Point(e. X, e. Y);

// Проверяем, не попадает ли указатель мыши в одну из трех областей,

// занимаемых изображениями.

if (rectA.Contains(mousePt)) {

isImageclicked = true;

imag = 0;

this.Text = "Вы кликнули изображение A";

}

else {

if (rectB. Contains(mousePt)) {

isImageclicked = true;

imag = 1;

this. Text = " Вы кликнули изображение B";

}

else if (rectC. Contains(mousePt)) {

isImageclicked = true;

imag = 2;

this.Text = " Вы кликнули изображение C";

}

else {

isImageclicked = false;

this.Text = "Изображения";

}

}

// Перерисовываем форму

Invalidate();

}

В приложение добавлена еще одна проверка: для щелчка мыши, который не попадает ни в одно из трех изображений. Эта проверка нужна для удаления рамки с выбранного перед этим изображения.

Вывод изображений и двойная буферизация

Способ уменьшения мерцания – использовать двойную буферизацию вывода – когда изображение сначала готовится "за кадром", а затем переносится на экран, устраняя мерцание при анимации. Рассмотрим пример вывода с двойной буферизацией:

using System.Threading; //добавляем для использования задержки

private void Form1_Paint(Object sender, PaintEventArgs e) {

//Graphics g = e. Graphics;

Graphics displayGraphics = e. Graphics;

int k=0;

while(k <500) {

Pen p = new Pen(Color. Red);

SolidBrush b= new SolidBrush(Color. Yellow);

SolidBrush b1= new SolidBrush(Color. Green);

//создаем объект - изображение, которое будет включать все, что нарисовано на форме

Image i = new Bitmap(Control. Height, Control. Width);

Graphics g = Graphics. FromImage(i);

g. Clear(Color. Aqua);

Thread. Sleep(200); //задержка на 300 миллисекунд

g. FillEllipse(b, k,150,30,45);

g. FillEllipse(b1,k+5,165,5,5);

g. FillEllipse(b1,k+20,165,5,5);

g. DrawArc(p, k+5,175,20,10,0,180);

g. FillRectangle(b1,0,190,500,100);

k=k+10;

//выводим на форму, созданное изображение

displayGraphics. DrawImage(i, ClientRectangle);

}

}

Для сравнения закомментируйте строки выделенные красным цветом и снимите комментарий со строки : Graphics g = e. Graphics;

Задания к лабораторной работе

1.  Разобрать предложенные фрагменты программ.

2.  Выполнить задание преподавателя. Нарисовать рисунок, используя графические примитивы, раскрасить и выполнить анимацию. Использовать двойную буферизацию.

1)  Нарисовать домик. Из трубы идет дым. По нажатию на заданную клавишу реализовать анимацию.

2)  Нарисовать машинку, двигающуюся по дороге. Движение и останов машинки реализовать по нажатию на клавиши клавиатуры.

3)  Нарисовать небо и движущиеся облака и солнце. Если облако закрывает солнце, идет дождь. Движение запускается и останавливается по щелчку мыши.

4)  Нарисовать летающий в пространстве мяч. Движение и останов реализовать по нажатию на клавиши клавиатуры.

5)  Нарисовать замкнутый прямоугольник, внутри которого двигается мячик и отталкивается от стенок прямоугольника. Начало и конец движения по щелчку мыши.

6)  Реализовать фрагмент игры в «Настольный теннис». Ракетка двигается и отбивает летящий шарик. Движение ракетки по нажатию клавиш управлением курсора.

7)  Нарисовать рисунок запуск ракеты. Движение начинать по щелчку мыши.

8)  Нарисовать рисунок – закипание жидкости в стакане. Температура увеличивается по нажатию клавиш управлением курсора.

9)  Нарисовать рисунок движение змейки по экрану. Направление движения задается нажатием на заданные клавиши клавиатуры.

10)  Нарисовать летающий в пространстве куб. Движение и останов реализовать по нажатию на клавиши клавиатуры.

Вопросы к защите лабораторной работы

1.  Как вывести изображение в форму?

2.  Класс Graphics и его методы.

3.  Как создать объект Graphics без события Paint?

4.  Как вывести изображение?

5.  Методы для настройки параметров изображения?

6.  Как проверить условие попадания курсора мыши в прямоугольную область, непрямоугольную область?

7.  Как организовать перетаскивание мышью графического объекта по форме?

8.  Как создать объект PictureBox?

9.  Для чего используют двойную буферизацию?

10.  Методы, используемые при двойной буферизации. Как вывести изображение, как создать изображение?

Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9