Файл: Справочник для опытных и как пособие для начинающих программистов. Компактдиск содержит исходные коды примеров из книги.doc

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 11.01.2024

Просмотров: 938

Скачиваний: 1

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
(рис. 4.9). Для этого создаем поток байтов Писатель для открытия файла student.usp. Если такой файл не существует, то он создается(Create), а если файл уже есть, то он перезаписывается. Как видно, для упрощения программы мы не использовали элемент управления ОpenFileDialog ддя открытия файла в диалоге.



Рис. 4.9. Фрагмент работы программы чтения/записи бинарных файлов

Далее преобразуем записанное в текстовых полях в более естественные типы данных. Номер по порядку Номер_пп — это тип int, преобразование в целый тип может быть реализовано операцией Сonvert.ToInt32 (можно использовать другие функции преобразования), для переменной СредБалл (средний балл) больше всего подходит тип с плавающей точкой Single, при этом преобразование осуществляет­ся операцией Convert.ToSingle. Преобразование для строковой переменной фио является необязательным и приведено для симметрии записей. Операторы Писа­тель.write записывают эти данные в файл. После блока Finally происходит обя­зательное закрытие (Сlose) файла.

Чтение файла выполняется при обработке события "щелчок мышью на кнопке" Читать. Как уже упоминалось, для максимального упрощения в данной программе не предусмотрено открытие файла через стандартный диалог, поэтому вначале процедуры выясняем, существует ли такой файл. Если файла C:\student.usp нет, то программируем выход (return) из обработчика данного события. Заметьте, чтобы программисту было максимально легко отслеживать ветви оператора if, мы написа­ли: "Если файла нет, то return". При этом длинная ветвь логики "если файл есть" не включена непосредственно в оператор if. Поэтому этот фрагмент программного кода читается (воспринимается) программистом легко.

Далее создается поток байтов Читатель из файла student.usp, открытого для чте­ния. Чтение из потока в каждую переменную реализовано с помощью функции ReadInt32 — читать из потока Читатель в переменную типа int, аналогично функциям ReadString и ReadSingle. Далее осуществлено конвертирование этих переменных в строковый тип Сonvert.ToString. Как видно, можно было изначально все текстовые поля записывать в файл без конвертирования, но при дальнейшем развитии этой программы значения полей все равно пришлось бы преобразовывать в соответствующий тип. После блока
Finally происходит закрытие (Сlose) файла. Блок Finally выполнится всегда, даже если перед ним была команда return.

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

catch (EndOfStreamException е)

а затем закрыть файл.

Убедиться в работоспособности программы можно, открыв peшение Read_Write_bin.sln в папке Read_Write_bin.


ГЛАВА 5 Редактирование графических данных

Пример 30. Простейший вывод отображения графического файла в форму



Рис. 5.1. Часть списка методов и свойств объекта Form1

Поставим задачу вывода в форму какого-нибудь изображения растрового гра­фического файла формата BMP, JPEG, PNG или других форматов. Для решения этой задачи запустим Visual Studio 2010, выберем шаблон Windows Forms Appli­cation С#. Двойной щелчок на проекте формы приведет нас на вкладку программ­ного кода. Работать с графикой в форме можно по-разному. Покажем работу с гра­фикой через переопределение метода ОnPaint.

Метод ОnPaint является членом класса Form. Этот метод можно увидеть, набрав "base." внутри какой-нибудь процедуры, в выпадающем списке методов и свойствобъекта Form1 (рис. 5.1).

Метод OnPaint можно переопределить, т. е. добавить к уже существующим функциям собственные. Для этого в окне программного кода напишем:

protected override void

и в появившемся раскрывающемся списке выберем ОnPaint. Система сама сгенерирует необходимые строчки процедуры, подлежащей переопределению: protected override void OnPaint(PaintEventArgs e)

{

base.OnPaint(e);

}

Теперь этот программный код следует дополнить командами для вывода в форму изображения из растрового файла poryv.png (листинг 5.1).

Листинг 5.1. Вывод растрового изображения в форму (вариант 1)

// Программа выводит в форму растровое изображение из графического файла

using System.Drawing;

using System.Windows. Forms ;

// Другие директивы using удалены, поскольку они не используются в данной программе

namespace Simple_Image1

{

public partial class Form1 : Form

{

public Form1()

{

InitializeComponent();

}

protected override void OnPaint(PaintEventArgs e)

{

base.OnPaint(e);

base.Text = "Рисунок";

// Размеры формы

this.Width = 200; this.Height = 200;

// Создаем объект для работы с изображением

Image Рисунок = new Bitmap)"С:\\poryv.png");

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

е.Graphics.DrawImage(Рисунок, 5, 5);

// х=5, у=5 - это координаты левого верхнего угла рисунка в

// системе координат формы: ось х - вниз, ось у - вправо

}

)

}

Как видно из текста программы, вначале указываем размеры формы с помощью свойств Width и Height, хотя размеры формы
удобно регулировать на вкладке конструктора формы "визуально". Далее создаем объект Рисунок для работы с изображением с указанием пути к файлу рисунка. Затем обращаемся непосредственно к методу рисования изображения в форме DrawImage, извлекая графический объект Graphics из аргумента е процедуры OnPaint. Фрагмент работы программы показан на рис. 5.2.



Рис. 5.2. Вывод растрового изображения в форму

Заметим, что это не единственный способ работы с графикой. Другой способ — это вызвать тот же метод OnPaint косвенно через событие формы OnPaint. Такой способ работы с графикой представлен в листинге 5.2. Создаем процедуру обра­ботки данного события обычным образом, т. е. на вкладке конструктора формы в панели свойств Properties щелкнем значок молнии и в появившемся списке всех событий для объекта Form1 выберем событие Paint. Объект Graphics получаем из аргумента е события Paint.

Листинг 5.2. Вывод растрового изображения в форму (вариант 2)

// Простейший вывод изображения в форму

using System.Drawing;

using System.Windows.Forms;

//Другие директивы using удалены, поскольку они не используются в данной программе

namespace Simple_Image2

{

Public partial class Form1 : Form

{

public Form1()

{

InitializeComponent();

base.Text = "Рисунок";

}

private void Form1_Paint(object sender, PaintEventArgs e)

{ // Событие рисования формы.

// Создаем объект для работы с изображением

Image Рисунок = new Bitmap)"С:\\poryv.png");

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

е.Graphics.Drawlmage(Рисунок, 5, 5);

}

}

}

Покажем еще один способ вывода графики в форму. В этом способе при щелчке на командной кнопке происходит непосредственное создание объекта Graphics. Программный код представлен в листинге 5.3.

Листинг 5.3. Вывод растрового изображения в форму (вариант 3)

using System;

using System.Drawing;

using System.Windows.Forms;

// Другие директивы using удалены, поскольку они не используются в данной программе

namespace Simple_Image3

{

public partial class Form1 : Form

{

public Form1 ()

{

InitializeComponent();

base.Text = "Рисунок";

button1.Text = "Показать рисунок";

}

private void button1_Click(object sender, EventArgs e)

{ // Событие "щелчок на кнопке"

var Рисунок = new Bitmap("С:Wporyv.png");

Graphics Графика = CreateGraphics();

// или Graphics Графика = this.CreateGraphics();

Графика.Drawlmage(Рисунок, 5, 5);

}

}

}

Убедиться в работоспособности данных программ можно, открыв соотв вующие решения в папках
Simple_Image1, Simple_Image2 и Simple Image3. В заключение замечу, что с рассмотренными в данном разделе методами можно работать не только для вывода изображений графических файлов в форму, но и решать многие другие задачи, связанные с графикой.

Пример 31. Использование элемента pictureBoxдля отображения растрового файла с возможностью прокрутки

Обычно для отображения точечных рисунков, рисунков из метафайлов, знач­ков, рисунков из файлов в форматах BMP, JPEG, GIF, PNG и проч. используется объект РictureBox. Часто рисунок оказывается слишком большим и не помещается целиком в пределах элемента управления PictureBox. Можно воспользоваться свойством элемента SizeMode, указав ему значение StretchImage. В этом случае изображение будет вытягиваться или сужаться, чтобы в точности соответствовать размеру PictureBox. Чаще всего такой подход не устраивает разработчика, поскольку изображение значительно деформируется. Напрашивается решение в организации возможности прокрутки изобажения (AutoScroll), но такого свойства у PictureBox нет. Зато такое свойство есть у элемента управления Panel. То есть, разместив PictureBox на элементе Panel с установленным свойством AutoScroll = true и при этом для PictureBox указав SizeMode = Autosize, имеем шанс решить задачу прокрутки изображения.

Запустим Visual Studio 2010, выберем проект шаблона Windows Forms Appli­cation С#. Из панели Toolbox перетащим на форму элемент управления Panel, а на него поместим элемент PictureBox. Далее перейдем на вкладку программного кода и введем текст, представленный на листинге 5.4.

Листинг 5.4. Вывод изображения на PictureBox с возможностью прокрутки

// Программа выводит изображение из растрового файла в PictureBox,

// размещенный на элементе управления Panel, с возможностью прокрутки изображения

using System.Drawing;

using System.Windows.Forms;

//Другие директивы using удалены, поскольку они не используются в данной программе

namespace БольшойРисунокСкроллинг

{

Public partial class Form1 : Form

{

public Form1()

{

InitializeComponent();

pictureBox1.Image = Image. FromFile ("С: //Pis . JPG");

// или Bitmap Изображение = new Bitmap("C:W011.BMP");

// а затем pictureBox1.Image = (Image)Изображение;

pictureBox1.SizeMode = PictureBoxSizeMode.AutoSize;

panell.AutoScroll = true;

this.Text = "Скроллинг";

}

}

}

Фрагмент работы программы приведен на рис. 5.3.



Рис. 5.3.