Читать «ЯЗЫК ПРОГРАММИРОВАНИЯ С# 2005 И ПЛАТФОРМА .NET 2.0. 3-е издание» онлайн - страница 488
Эндрю Троелсен
public partial class MainForm: Form {
private List‹Point› myPts = new List‹Point›();
publiс MainForm() {
…
this.MouseDown += new MouseEventHandler(MainForm_MouseDown);
}
private void MainForm_MouseDown(object sender, MouseEventArgs e) {
// Добавление в коллекцию.
myPts.Add(new Point(e.X, e.Y));
Invalidate();
}
private void MainForm_Paint(object sender, PaintEventArgs e) {
Graphics g = e.Graphics;
g.DrawString("Привет GDI+", new Font("Times New Roman", 20), new SolidBrush(Color.Black), 0, 0);
foreach(Point p in myPts) g.FillEllipse(Brushes.Firebrick, p.X, p.Y, 10, 10);
}
}
При таком подходе уже отображенные круги будут оставаться на месте, поскольку графическая визуализация обрабатывается в рамках события Paint. На рис. 20.1 показано окно тестового запуска этого приложения.
Рис 20.1. Простое графическое приложение
Исходный код. Проект BasiсPaintForm размещен в подкаталоге, соответствующем главе 20.
Освобождение объекта Graphics
Если вы внимательно читали несколько последних страниц, то могли заметить, что в
• Если объект Graphics был создан вами непосредственно, после окончания его использования его следует освободить.
• Если вы ссылаетесь на существующий объект Graphics, его освобождать не следует.
Для того чтобы это стало более понятным, рассмотрите следующий обработчик события Paint.
private void MainForm Paint(object sender, PaintEventArgs e) {
// Загрузка локального файла *.jpg.
image myImageFile = Image.FromFile("landscape.jpg");
// Создание нового объекта Graphics на основе изображения.
Graphics imgGraphics = Graphics.FromImage(myImageFile);
// Визуализация новых данных.
imgGraphics.FillEllipse(Brushes.DarkOrange, 50, 50, 150, 150);
// Нанесение изображения на форму.
Graphics g = e.Graphics;
g.DrawImage(myImageFile, new PointF(0.0F, 0.0F));
// Освобождение созданного нами объекта Graphics.
imgGraphics.Dispose();
}
На данном этапе обсуждения не беспокойтесь о том, что некоторые элементы программной логики GDI+ могут быть для вас не вполне понятны. Однако обратите внимание на то, что здесь объект Graphics получается из файла *.jpg, загружаемого (с помощью статического метода Graphics.FromImage()) из локального каталога приложения. Поскольку объект Graphics создается явно, после окончания использовании этого объекта лучше использовать Dispose(), чтобы освободить внутренние ресурсы и сделать их снова доступными для использования другими компонентами системы.