Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

lec

.pdf
Скачиваний:
41
Добавлен:
24.03.2015
Размер:
3.43 Mб
Скачать

рис.8

Когда вся клиентская область окна формы или часть этой области требует перерисовки, форме передается событие Paint.

Элементы управления выполняют обработку события Paint сами, перерисовывая при необходимости свои окна.

//Демонстрация перерисовки содержимого экрана

//Программа выводит строку текста, прямоугольник и эллипс при

//обработке сообщения Paint.

using System;

using System.Drawing;

using System.Windows.Forms;

public class Form1 : Forms.Form

{

private System.ComponentModel.Container components = null;

public Form1() { InitializeComponent(); }

protected override void Dispose( bool disposing )

{

if( disposing )

401

if (components != null) components.Dispose();

base.Dispose( disposing );

}

+Windows Form Designer generation code

static void Main()

{ Application.Run(new Form1()); }

public string text = "Обработка события Paint"; // моя строка

private void Form1_Paint (object sender, Forms.PaintEventArgs e)

{

Graphics g = e.Graphics; /* е – ссылка на объект, имеющий свойства: - Graphics – контекст устройства

- ClipRectangle – границы области перерисовки

*/

g.Clear (Color.White);

// Закрасить окно белым цветом

/* Вывод строки text с использ. объекта Font и свойства Black

статич. класса System.Drawing.Brushes, в координатах 0,0 */ g.DrawString (text, new Font(”Arial”, 15), Brushes.Black, 0, 0);

/* Вывод незакрашенного прямоугольника в координатах 10,30 шириной 200 и высотой 100 пикселей с использ. пера - объекта Pen, инициализированного цветом Brushes.Green с шириной линий 2 пикселя */

g.DrawRectangle (new Pen(Brushes.Green,2), 10, 30, 200, 100);

// Вывод незакрашенного эллипса g.DrawEllipse (new Pen(Brushes.Red,8), 150, 120, 100, 130);

}

}

1.

Graphics g = e.Graphics; e определяет только часть окна для перерисовки.

2.

Graphics g = Graphics.FromНwnd (this.Handle); е определяет для пе-

рерисовывания все окно.

8. Генерация сообщения Paint и перерисовка содержимого окна

Можно сгенерировать собщение Paint вручную с помощью метода

окно.Invalidate();

При этом произойдет очистка окна.

402

//Демонстрация генерации сообщения Paint

//и перерисовки содержимого окна.

//Программа запоминает координаты курсора в момент щелчка

//клавиши мыши и генерирует сообщение Paint.

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

//запомненных координатах.

using System;

using System.Drawing;

using System.Windows.Forms;

public class Form1 : Forms.Form

{

private System.ComponentModel.Container components = null;

public Form1() { InitializeComponent(); }

protected override void Dispose( bool disposing )

{

if( disposing )

if (components != null) components.Dispose();

base.Dispose( disposing );

}

+ Windows Form Designer generation code

static void Main()

{ Application.Run(new Form1()); }

int X, Y;

// координаты курсора мыши

void Form1_MouseDown (object sender, MouseEventArgs e)

{

X = e.X; Y = e.Y;

 

Invalidate();

// генерация Paint

}

private void Form1_Paint (object sender, Forms.PaintEventArgs e)

{

if ( X > 0 & Y > 0 )

g.DrawRectangle (new Pen (Brushes.Green,2), X, Y, 200, 100);

}

}

9. Методы и свойства класса Graphics

Очистка окна. Пример: закрасить окно белым цветом

g.Clear (Color.White);

403

Рисование геометрических фигур

Имена большого количества методов, определенных в классе Graphics, начинаются с префиксов Draw и Fill.

Первые из них предназначены для рисования текста, линий и незакрашенных фигур (таких, например, как прямоугольные рамки),

а вторые - для рисования закрашенных геометрических фигур.

Линия

public void DrawLine (Pen, Point, Point); public void DrawLine (Pen, PointF, PoinF); public void DrawLine (Pen, int, int, int, int);

public void DrawLine (Pen, float, float, float, float);

Для получения такого окна добавьте в обработку события Paint код, приведенный ниже:

рис.9

private void Form1_Paint(object sender, PaintEventArgs e)

{

Graphics g = e.Graphics ; g.Clear (Color.White) ;

Pen pen = new Pen (Brushes.Black, 2);

for (int i=0; i<50; i++)

g.DrawLine (pen, 10, 4*i+20, 200, 4*i+20) ;

}

404

Набор линий

public void DrawLines (Pen, Point[ ]); public void DrawLines (Pen, PointF[ ]);

Пример вывода соединяющихся линий.

рис.10

using System.Drawing.Drawing2D;

// Добавить в конструктор

Point[] points = new Point[50];

for (int i=0; i < 20; i++)

{

int xPos;

if (i%2 == 0) xPos=10;

else

xPos=400;

points[i] = new Point(xPos, 10 * i);

}

Pen pen = new Pen(Brushes.Black, 2);

. . . . . . . . . .

private void Form1_Paint(object sender, PaintEventArgs e)

{

Graphics g = e.Graphics ; g.Clear (Color .White) ;

// Высококачественное сглаживание g.SmoothingMode = SmoothingMode.HighQuality;

g.DrawLines (pen, points);

405

}

Незакрашенный прямоугольник

Метод DrawRectangle позволяет рисовать прямоугольники, заданные координатами верхнего левого угла, а также шириной и высотой.

public void DrawRectangle (Pen, Rectangle); public void DrawRectangle (Pen, int, int, int, int);

public void DrawRectangle (Pen, float, float, float, float);

Класс Rectangle имеет свойства: X и Y,

Width и Height.

Набор незакрашенных прямоугольников

public void DrawRectangles(Pen, Rectangle[]); public void DrawRectangles(Pen, RectangleF[]);

Незакрашенный многоугольник

public void DrawPolygon (Pen, Point []) ; public void DrawPolygon (Pen, PointF[]);

Незакрашенный эллипс

Эллипс вписывается в прямоугольник.

public void DrawEllipse (Pen, Rectangle); public void DrawEllipse (Pen, RectangleF) ; public void DrawEllipse (Pen, int, int, int, int);

public void DrawEllipse (Pen, float, float, float, float);

Сегмент эллипса

public void DrawArc (Pen, Rectangle, float, float); public void DrawArc (Pen, RectangleF, float, float); public void DrawArc (Pen, int, int, int, int, int, int);

public void DrawArc (Pen, float, float, float, float, float, float);

Незакрашенный замкнутый сегмент эллипса

public void

DrawPie (Pen,

Rectangle, float, float);

public void

DrawPie (Pen,

RectangleF, float, float);

public void

DrawPie (Pen,

int, int, int, int, int, int);

public void DrawPie (Pen, float, float, float, float, float, float);

Кривые Безье

Кривая проходит через 4 точки: нач., кон. и 2 управл. public void DrawBezier (Pen, Point, Point, Point, Point);

Еще 4 метода.

406

Канонические сплайны

Кривая проходит через все точки.

public void DrawCurve (Pen, Point []) ;

Еще несколько методов.

Закрашенные фигуры

Префикс Fill:

Метод

Описание

FillRectangle

Рисование закрашенного прямоугольника

FillRectangles

Рисование множества закрашенных мно-

 

гоугольников

FillPolygon

Рисование закрашенного многоугольника

FillEllipse

Рисование закрашенного эллипса

FillPie

Рисование закрашенного сегмента эллип-

 

са

FillClosedCurve

Рисование закрашенного сплайна

FillRegion

Рисование закрашенной области типа

 

Region

Вместо пера используется кисть:

Brush br = Brushes.Red; g.FillRectangle (br, e.X, e.Y, 4, 4);

10. Ресурсы приложения

Приложение Microsoft Windows может хранить в виде ресурсов текстовые строки, значки, курсоры, графические изображения, меню, диалоговые окна, произвольные массивы данных и т. д.

Физически ресурсы находятся внутри ехе-файла приложения.

Они могут загружаться в оперативную память автоматически при запуске приложения или по запросу приложения (явному или неявному).

В приложениях Microsoft .NET Framework тоже используется концепция pecypcoв. В частности, ресурсы таких приложений могут содержать значки и графические изображения.

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

Методы Drawlcon – рисование значка:

С растяжением/сжатием

public void Drawlcon (Icon, Rectangle) ;

Без растяжения/сжатия

public void Drawlcon (Icon, int, int) ;

• Без растяжения/сжатия. Значок обрезается. public void DrawIconUnstretched(Icon, rect);

Пример.

1. Добавьте в проект файл со значком.

407

2.Установите у этого файла свойство Build Action, равное Embedded Resource (встраиваемый ресурс).

3.Создайте обработчик события Form1_MouseDown. Поэкспериментируйте с размерами области отображения.

Rectangle rect;

private void Form1_MouseDown(object sender, MouseEventArgs e)

{

Graphics g = Graphics.FromHwnd(Handle);

/* Создать объект-иконку. Конструктору передается:

1) местоположение иконки в виде метода

GetType() - ссылка на объект-сборку 2) имя иконки. */

Icon myIcon = new Icon(GetType(), "myIcon.ico");

// нарисовать иконку

rect.X = e.X; rect.Y = e.Y; rect.Width = 50; rect.Height = 50;

//g.DrawIcon(myIcon, rect);

// нарисовать иконку без растяжения фиксированного размера g.DrawIcon(myIcon, e.X+100, e.Y+100);

g.DrawIconUnstretched(myIcon, rect);

// Как есть

}

 

Пример (для продвинутых).

В следующем примере показано, как, используя разные события мыши, изобразить путь указателя мыши на панеле.

Для каждого из происходящих событий MouseMove и MouseDown в GraphicsPath добавляется сегмент линии.

Чтобы обновлять рисунок, при каждом событии MouseDown или

MouseUp для Panel вызывается метод Invalidate.

Кроме того, в случае события MouseWheel (вил) (колесо) графический путь прокручивается вверх или вниз.

На экране также отображаются дополнительные события мыши, такие как MouseHover (зависание).

Кроме того, отображаются и дополнительные сведения о мыши, со-

держащиеся в классе SystemInformation.

using System;

using System.Collections.Generic; using System.ComponentModel; using System.Data;

using System.Drawing; using System.Text;

using System.Windows.Forms;

public partial class Form1 : Form

{

public Form1()

408

{

mousePath = new System.Drawing.Drawing2D.GraphicsPath(); InitializeComponent();

label2.Text = "SystemInformation.DoubleClickSize: " + SystemInformation.DoubleClickSize.ToString(); label3.Text = "SystemInformation.DoubleClickTime: " + SystemInformation.DoubleClickTime.ToString();

label4.Text = "SystemInformation.MousePresent: " + SystemInformation.MousePresent.ToString(); label5.Text = "SystemInformation.MouseButtons: " + SystemInformation.MouseButtons.ToString();

label6.Text = "SystemInformation.MouseButtonsSwapped: " + SystemInformation.MouseButtonsSwapped.ToString();

label7.Text = "SystemInformation.MouseWheelPresent: " + SystemInformation.MouseWheelPresent.ToString();

label8.Text = "SystemInformation.MouseWheelScrollLines: " + SystemInformation.MouseWheelScrollLines.ToString();

label9.Text = "SystemInformation.NativeMouseWheelSupport: " + SystemInformation.NativeMouseWheelSupport.ToString();

}

// GraphicsPath представляет последовательность соединенных линий и кривых. private System.Drawing.Drawing2D.GraphicsPath mousePath;

private int fontSize = 20;

private void panel1_MouseDown(object sender, MouseEventArgs e)

{

// Update the mouse path with the mouse information Point mouseDownLocation = new Point(e.X, e.Y);

string eventString = null; switch (e.Button)

{

case MouseButtons.Left: eventString = "L"; break;

case MouseButtons.Right: eventString = "R"; break;

case MouseButtons.Middle: eventString = "M"; break;

case MouseButtons.XButton1: eventString = "X1";

break;

case MouseButtons.XButton2: eventString = "X2";

break;

case MouseButtons.None: default:

break;

}

409

if (eventString != null)

{

mousePath.AddString(eventString, FontFamily.GenericSerif, (int)FontStyle.Bold, fontSize, mouseDownLocation, StringFormat.GenericDefault);

}

else

{

mousePath.AddLine(mouseDownLocation, mouseDownLocation);

}

panel1.Focus();

panel1.Invalidate();

}

private void panel1_MouseEnter(object sender, EventArgs e)

{

// Update the mouse event label to indicate the MouseEnter event occurred. label1.Text = sender.GetType().ToString() + ": MouseEnter";

}

private void panel1_MouseHover(object sender, EventArgs e)

{

// Update the mouse event label to indicate the MouseHover event occurred. label1.Text = sender.GetType().ToString() + ": MouseHover";

}

private void panel1_MouseLeave(object sender, EventArgs e)

{

// Update the mouse event label to indicate the MouseLeave event occurred. label1.Text = sender.GetType().ToString() + ": MouseLeave";

}

private void panel1_MouseMove(object sender, MouseEventArgs e)

{

// Update the mouse path that is drawn onto the Panel. int mouseX = e.X;

int mouseY = e.Y;

mousePath.AddLine(mouseX, mouseY, mouseX, mouseY);

}

private void panel1_MouseUp(object sender, MouseEventArgs e)

{

Point mouseUpLocation = new System.Drawing.Point(e.X, e.Y);

// Show the number of clicks in the path graphic. int numberOfClicks = e.Clicks;

mousePath.AddString(" " + numberOfClicks.ToString(), FontFamily.GenericSerif, (int)FontStyle.Bold,

fontSize, mouseUpLocation, StringFormat.GenericDefault); panel1.Invalidate();

}

private void panel1_Paint (object sender, PaintEventArgs e)

410

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]