Программировать на языке C# без .NET Framework — это все равно что писать ручкой без чернил. Сколько ни води ею по бумаге, написать ничего не удастся.
Так что же такое .NET Framework? Это платформа программирования, разработанная корпорацией Microsoft, и язык C# создавался специально для нее. Платформа .NET Framework состоит из двух частей.
Итак, при написании программы на языке C# (или на любом другом языке .NET) наряду с созданием собственного кода используются классы, хранящиеся в библиотеке.

Библиотека .NET framework содержит огромное количество классов, и некоторые из них настолько сложны, что мы даже не будем пытаться рассмотреть все сразу. Расскажем лишь о тех, которые, на наш взгляд, наиболее полезны для начинающих программистов. Со временем вы станете запоминать классы, которыми пользуетесь чаще, чем другими, и постепенно хорошо их освоите. Ведь когда часто берешь в библиотеке любимую книгу, то легко запоминаешь, на какой полке ее искать.
Обращаю ваше внимание: в этой части курса приведено много примеров программ, которые вы должны сначала испытать в работе, а затем попытаться изменить их, чтобы добиться новых результатов. Ранее мы уже рассказывали, как запускать примеры, представленные на сайте в архиве, который Вы можете скачать в лекции 1.
Я слышу ваше возмущение: "Легко сказать: измени программу! Но откуда мне знать, в каком направлении двигаться? В приведенных примерах используются лишь некоторые методы и классы .NET Framework, но ведь их очень много! Как о них узнать?"
Для этого есть несколько способов:

Подсказка работает и для методов. Если поставите открывающую скобку после имени метода, то увидите типы параметров, которые он может принимать. Зачастую в C# используются одноименные методы с различными наборами параметров — в таком случае список надо "прокручивать" (перемещаться по нему) вверх и вниз при помощи клавиш с изображенными на них стрелками. В следующем примере показано, что произойдет, если набрать Console.WriteLine(. Visual C# Express подскажет о существовании 19 различных способов вызова метода WriteLine. Мы прокрутили список вниз до 11-й позиции (см. рисунок ниже).

Понятие "консоль" пришло к нам из тех времен, когда были популярны большие компьютеры, их называли мейнфреймами. Компания размещала в каком-нибудь помещении один гигантский компьютер, а на рабочих местах служащих устанавливалась только клавиатура и простенький монитор, называвшийся консолью. Клавиатура и монитор подключались к тому самому "монстру", спрятанному от посторонних глаз в отдельной комнате. Такие мониторы не умели отображать графику — только текст. Информация передавалась в

Сегодня мониторы большинства компьютеров имеют гораздо более совершенные возможности и способны отображать не только текст, но и, например, фотографии.
Однако при выполнении многих задач никаких графических изысков не требуется. Например, программа, получающая какие-либо данные с сервера в Интернете и сохраняющая их в файле на вашем компьютере, должна уметь выводить только два сообщения: "идет получение данных" и "готово". Зачем тратить время на разработку затейливого пользовательского интерфейса, который занимает много памяти? Именно по этой причине в библиотеку .NET включен класс для быстрого написания
Не стоит относиться снисходительно к
Конечно, если вашей программой будет пользоваться кто-то еще, то вы, вероятно, окажете ему большую услугу, сделав интерфейс чуть более дружественным, чем в стандартном
Некоторые полезные методы:
Console.ReadLine — считывает строку символов, введенную с клавиатуры (или иного устройства ввода).Console.WriteLine — выводит текст на экран (или иное устройство вывода) начиная с новой строки.Console.Write — выводит на экран ряд символов без перехода на новую строку.Пример программы 3.1
Следующая программа выводит на экран слово "Ура!" и после этого ожидает нажатия клавиши ВВОД.
using System;
class PleaseSayUra
{
static void Main()
{
// Выводим слово на экран
Console.Write("Ура!");
// Ожидаем нажатия клавиши ВВОД
Console.ReadLine();
}
}

Пример программы 3.2
Следующая программа:
using System;
class WriteAFewLines
{
static void Main()
{
Console.WriteLine("Введите Ваше любимое слово : ");
// Сохраняем в строковой переменной введенное пользователем слово
string favouriteWord = Console.ReadLine();
Console.WriteLine("Сколько раз его напечатать? ");
// Сохраняем в целочисленной переменной введенное число
// (При неправильном вводе числа произойдет ошибка)
int numberOfTimes = Convert.ToInt32(Console.ReadLine());
// Выводим на экран слово указанное количество раз
for (int i = 0; i < numberOfTimes; i++)
{
Console.WriteLine(favouriteWord);
}
// Ожидаем нажатия клавиши ВВОД
Console.ReadLine();
}
}

Если вы захотите писать программы, похожие на привычные приложения Windows, то наверняка воспользуетесь классами из пространства имен System.Windows.Forms. Они позволяют задействовать кнопки, списки, текстовые поля, меню, окна сообщений и множество других "элементов управления". Элементы управления — это то, что вы помещаете в форму. Они нужны для вывода информации, например, текстовой (элемент управления Label ) или графической (элемент управления PictureBox ), либо для выполнения определенных действий, например, выбора значения или перехода к другой форме после нажатия кнопки. Все элементы управления помещаются на форму.
Понятие "форма", принятое в программировании, родственно понятию "форма анкеты" или "форма документа" из обычной жизни. На форме можно в определенном порядке расположить различные

В программировании понятие формы во многом похоже: форма позволяет размещать текст, изображения, поля ввода, кнопки и т. п., добиваясь их точного расположения на экране. В
Компания Майкрософт предоставила в составе библиотеки классов .NET Framework огромное количество "элементов управления", которые можно помещать на формы. Освоив этот инструмент, вы сможете быстро создавать эффектные приложения.
Вот некоторые элементы управления, которые можно размещать на формах:
Возможно, вы предпочтете не использовать уже заготовленные примеры проектов, а разрабатывать их "с нуля". В таком случае нужно учесть, что для каждого проекта C# Express сразу же создает два файла (с именами Form1.cs и Program.cs ) и наполняет их исходным кодом на языке C#, то есть вы изначально получаете простейшую, но полноценную программу. Предлагаемый нами способ работы с уже полученным проектом состоит в выполнении следующих действий:
Оба этих действия не понадобятся, если вы открываете программы с помощью команды "Открыть проект" в меню "Файл" и находите нужный проект в той папке, куда его поместили после разархивации.
Пример программы 3.3
Рассмотрим пример простейшего приложения Windows Forms. Оно всего лишь создает новую форму и выводит определенный текст в заголовок окна формы.
using System.Windows.Forms;
class SimpleWindowsForm : Form
{
// Метод-конструктор нашего класса
public SimpleWindowsForm()
{
// Указываем заголовок окна
this.Text = "Это простая форма с заголовком";
}
static void Main()
{
// Создаем новый экземпляр класса
//и запускаем его на выполнение
// В результате на экране дисплея откроется форма
Application.Run(new SimpleWindowsForm());
}
}

Пример программы 3.4
Следующий пример тоже достаточно прост, но мы делаем шаг вперед — размещаем на форме кнопку.
using System.Windows.Forms;
class SimpleWindowsFormWithButton : Form
{
Button button1;
// Метод-конструктор нашего класса
public SimpleWindowsFormWithButton()
{
// Указываем заголовок окна
this.Text = "Форма с командной кнопкой";
// Добавляем кнопку в коллекцию элементов управления формы
// Хотя на кнопке написано: "Нажми меня!",
// пока при нажатии ничего не происходит!
button1 = new Button();
button1.Text = "Нажми меня!";
button1.Top = 100;
button1.Left = 100;
button1.Height = 50;
button1.Width = 70;
this.Controls.Add(button1);
}
static void Main()
{
// Создаем и запускаем форму
Application.Run(new SimpleWindowsFormWithButton());
}
}

Пример программы 3.5
Кнопку на форму мы поместили, но при нажатии на нее ничего не происходит. Это скучно.
Нам нужно описать метод, который будет выполнять какое-либо действие при нажатии на кнопку. Пусть при этом текст в заголовке окна будет меняться. Поскольку такой метод отслеживает наступление некоторого события (в нашем случае – нажатие на кнопку) и затем каким-то образом обрабатывает его, он, напомним, называется "обработчик события". Кроме того, надо привязать обработчик события к соответствующему событию, то есть к нажатию на кнопку.
using System;
using System.Windows.Forms;
using System.Drawing;
class FormWithWorkingButton : Form
{
Button mrButton;
// Метод-конструктор нашего класса
public FormWithWorkingButton()
{
// Указываем заголовок окна
this.Text = "Форма с работающей кнопкой!";
// Добавляем кнопку и привязываем ее к обработчику события
mrButton = new Button();
mrButton.Text = "Нажми меня";
mrButton.Top = 100;
mrButton.Left = 100;
mrButton.Height = 50;
mrButton.Width = 70;
mrButton.Click += new System.EventHandler(mrButton_Click);
this.Controls.Add(mrButton);
}
static void Main()
{
// Создаем и запускаем форму
Application.Run(new FormWithWorkingButton());
}
// Обработчик события, срабатывающий при нажатии кнопки
void mrButton_Click(object sender, EventArgs e)
{
// Изменяем текст
mrButton.Text = "Кнопка была нажата!";
}
}

Пример программы 3.6
Мы добились успеха: наша программа умеет выполнять основные действия. Теперь добавим на форму несколько новых элементов управления, аккуратно разместим их и немного поработаем с ними. Возьмем элементы управления 4-х типов: Button, ListBox, MessageBox и PictureBox.
Обратите внимание: кроме System.Windows.Forms в этом примере упоминается пространство имен System.Drawing. Дело в том, что мы используем элемент управления PictureBox, а для работы с изображениями требуются классы Drawing.
using System.Windows.Forms;
using System.Drawing;
class MyForm : Form
{
// Объявим элемент ListBox как поле класса:
// нам придется обращаться к нему из разных методов
ListBox listBox1;
// Метод-конструктор нашего класса
public MyForm()
{
//Размеры формы
this.Size = new Size(400, 400);
// Создадим элемент PictureBox, поместим в него изображение,
// добавим его на форму
PictureBox pictureBox1 = new PictureBox();
pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;
Bitmap image1 = new Bitmap ("..//..//images//Zakat.jpg");
pictureBox1.ClientSize = new Size(this.Width, 150);
pictureBox1.Image = (Image)image1;
this.Controls.Add(pictureBox1);
// Создаем объект Button, определяем некоторые из его свойств
Button button1 = new System.Windows.Forms.Button();
button1.Location = new Point(150, 160);
button1.Size = new Size(100, 30);
button1.Text = "Нажми меня";
button1.Click += new System.EventHandler(button1_Click);
this.Controls.Add(button1);
// Создаем ListBox, определяем свойства и добавляем на форму
listBox1 = new System.Windows.Forms.ListBox();
listBox1.Location = new System.Drawing.Point(20, 200);
listBox1.Size = new Size(100, 100);
listBox1.Items.Add("Лес");
listBox1.Items.Add("Степь ");
listBox1.Items.Add("Озеро");
listBox1.Items.Add("Море");
listBox1.Items.Add("Океан");
listBox1.SelectedIndex = 2;
this.Controls.Add(listBox1);
}
// Обработчик события, срабатывающий при нажатии кнопки
void button1_Click(object sender, System.EventArgs e)
{
// Выводим сообщение с указанием выбранного в списке пункта
MessageBox.Show(this, "Вы выбрали " + listBox1.SelectedItem,
"Уведомление", MessageBoxButtons.OK);
}
static void Main()
{
// Создаем и запускаем форму
Application.Run(new MyForm());
}
private void InitializeComponent()
{
this.SuspendLayout();
//
// MyForm
//
this.BackColor = System.Drawing.SystemColors.Control;
this.ClientSize = new System.Drawing.Size(292, 273);
this.Name = "MyForm";
this.ResumeLayout(false);
}
}
Пример программы 3.7
Итак, настала пора испытать свои силы. Попробуем написать одну действительно большую программу, используя целый ряд полезных элементов управления. Объем кода может показаться пугающе большим, но программа вам пригодится, когда нужно будет вспомнить, для чего нужен тот или иной элемент управления.
Программа весьма интересна и стоит того, чтобы вы тщательно с ней поработали. После ее запуска открывается форма, в которой меню построено при помощи
Досконально разбирать текст всей программы необязательно, но когда у вас возникнут вопросы по использованию, например, элемента CheckBox, вы можете просмотреть ту ее часть, которая касается этого элемента.
Напоминаем: для того чтобы использовать элементы управления PictureBox и DataGridView, требуются пространства имен System.Drawing, System.Data и System.Xml.
using System;
using System.Windows.Forms;
using System.Drawing;
using System.Data;
using System.Xml;
class FormWithManyControls : Form
{
TreeView treeView1;
Panel panel1;
CheckBox checkBox1, checkBox2;
RadioButton radioButton1, radioButton2;
ListBox listBox1;
// Метод-конструктор нашего класса
public FormWithManyControls()
{
// Указываем размеры и заголовок окна
this.Text = "Форма, включающая различные элементы управления!";
this.Height = 800; this.Width = 900;
// Добавляем элемент TreeView в качестве своеобразного меню
treeView1 = new TreeView();
treeView1.BackColor = Color.BurlyWood;
treeView1.Dock = DockStyle.Left;
treeView1.AfterSelect +=
new System.Windows.Forms.TreeViewEventHandler(treeView1_AfterSelect);
TreeNode tn = new TreeNode("Элементы");
tn.Expand();
tn.Nodes.Add(new TreeNode("[Очистить]"));
tn.Nodes.Add(new TreeNode("Label"));
tn.Nodes.Add(new TreeNode("Button"));
tn.Nodes.Add(new TreeNode("CheckBox"));
tn.Nodes.Add(new TreeNode("RadioButton"));
tn.Nodes.Add(new TreeNode("ListBox"));
tn.Nodes.Add(new TreeNode("TextBox"));
tn.Nodes.Add(new TreeNode("TabControl"));
tn.Nodes.Add(new TreeNode("DataGridView"));
tn.Nodes.Add(new TreeNode("MainMenu"));
tn.Nodes.Add(new TreeNode("ToolBar"));
tn.Nodes.Add(new TreeNode("PictureBox"));
tn.Nodes.Add(new TreeNode("RichTextBox"));
treeView1.Nodes.Add(tn);
this.Controls.Add(treeView1);
// Добавляем панель для размещения остальных элементов управления
panel1 = new Panel();
panel1.Dock = DockStyle.Right;
panel1.BorderStyle = BorderStyle.Fixed3D;
panel1.Width = this.Width - treeView1.Width;
this.Controls.Add(panel1);
}
// Обработчик событий, срабатывающий при выборе одного из узлов дерева
// TreeView
private void treeView1_AfterSelect
(object sender, System.Windows.Forms.TreeViewEventArgs e)
{
// Выполнение соответствующего действия при выборе любого из узлов
if (e.Node.Text == "[Очистить]")
{
// Удаляем с панели все элементы управления
panel1.Controls.Clear();
}
else if (e.Node.Text == "Button")
{
// Добавляем на панель кнопку
Button button1 = new Button();
button1.Text = "Нажми меня!";
button1.Location = new Point(300, 20);
button1.Width = 120;
button1.Height = 40;
button1.Click += new EventHandler(button1_Click);
panel1.Controls.Add(button1);
}
else if (e.Node.Text == "Label")
{
// Добавляем на панель метку
Label label1 = new Label();
label1.Text =
"Это надпись. Используется для вывода текста на экран!";
label1.Location = new Point(180, 70);
label1.Width = 400;
label1.Click += new EventHandler(label1_Click);
panel1.Controls.Add(label1);
}
else if (e.Node.Text == "CheckBox")
{
// Добавляем на панель несколько флажков
checkBox1 = new CheckBox();
checkBox1.Text = "Я способный!";
checkBox1.Location = new Point(20, 40);
checkBox1.Width = 150;
checkBox1.CheckedChanged +=
new EventHandler(CheckBox_CheckedChanged);
panel1.Controls.Add(checkBox1);
checkBox2 = new CheckBox();
checkBox2.Text = "Я скромный!";
checkBox2.Location = new Point(20, 80);
checkBox2.Width = 150;
checkBox2.CheckedChanged +=
new EventHandler(CheckBox_CheckedChanged);
panel1.Controls.Add(checkBox2);
}
else if (e.Node.Text == "RadioButton")
{
// Добавляем на панель несколько переключателей
radioButton1 = new RadioButton();
radioButton1.Text = "Я добрый!";
radioButton1.Location = new Point(20, 120);
radioButton1.Width = 150;
radioButton1.Height = 30;
//radioButton1.Size = new Size(20, 100);
radioButton1.CheckedChanged +=
new EventHandler(RadioButton_CheckedChanged);
panel1.Controls.Add(radioButton1);
radioButton2 = new RadioButton();
radioButton2.Text = "Я трудолюбивый!";
radioButton2.Location = new Point(20, 160);
radioButton2.Width = 150;
radioButton2.Height = 30;
//radioButton2.Size = new Size(20, 100);
radioButton2.CheckedChanged +=
new EventHandler(RadioButton_CheckedChanged);
panel1.Controls.Add(radioButton2);
}
else if (e.Node.Text == "ListBox")
{
// Добавляем на панель список
listBox1 = new ListBox();
listBox1.Items.Add("Зеленый");
listBox1.Items.Add("Желтый");
listBox1.Items.Add("Голубой");
listBox1.Items.Add("Серый");
listBox1.Location = new Point(20, 250);
listBox1.Width = 100; listBox1.Height = 100;
listBox1.SelectedIndexChanged +=
new EventHandler(listBox1_SelectedIndexChanged);
panel1.Controls.Add(listBox1);
}
else if (e.Node.Text == "TextBox")
{
// Добавляем на панель текстовое поле
TextBox textBox1 = new TextBox();
textBox1.Multiline = true;
textBox1.Text = "Это текстовое окно. Сюда можно вводить текст!" +
"\r\n" + " Сотрите этот текст и введите свой!";
textBox1.Location = new Point(180, 100);
textBox1.Width = 400; textBox1.Height = 40;
panel1.Controls.Add(textBox1);
}
else if (e.Node.Text == "DataGridView")
{
// Добавляем на панель таблицу, заполненную данными из файла xml
DataSet dataSet1 = new DataSet("Пример DataSet");
dataSet1.ReadXml("..//..//images//marks.xml");
DataGridView dataGridView1 = new DataGridView();
dataGridView1.Width = 250;
dataGridView1.Height = 150;
dataGridView1.Location = new Point(20, 500);
dataGridView1.AutoGenerateColumns = true;
dataGridView1.DataSource = dataSet1;
dataGridView1.DataMember = "предметы";
//dataGridView1.DataMember = "оценка";
//dataGridView1.ColumnCount = 2;
panel1.Controls.Add(dataGridView1);
}
else if (e.Node.Text == "TabControl")
{
// Добавляем на панель элемент управления вкладками
// и наполняем каждую вкладку содержимым
TabControl tabControl1 = new TabControl();
tabControl1.Location = new Point(190, 150);
tabControl1.Size = new Size(300, 300);
TabPage tabPage1 = new TabPage("Вадик");
PictureBox pictureBox1 = new PictureBox();
pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;
pictureBox1.Image = new Bitmap("..//..//images//Vadik.jpg");
pictureBox1.Size = new Size(300, 200);
tabPage1.Controls.Add(pictureBox1);
Label labelV = new Label();
labelV.Top = 200;
labelV.Size = new Size(300, 50);
labelV.Text = "Это Вадик! Он любит купаться и работать на компьютере!";
tabPage1.Controls.Add(labelV);
tabControl1.TabPages.Add(tabPage1);
TabPage tabPage2 = new TabPage("Его компьютер");
PictureBox pictureBox2 = new PictureBox();
pictureBox2.SizeMode = PictureBoxSizeMode.StretchImage;
pictureBox2.Image = new Bitmap("..//..//images//comp.jpg");
pictureBox2.Size = new Size(300, 200);
tabPage2.Controls.Add(pictureBox2);
Label labelС = new Label();
labelС.Top = 200;
labelС.Size = new Size(300, 50);
labelС.Text = "Это компьютер Вадика! Пока Вадик купается, " +
"он разрешает работать на компьютере ящерице!";
tabPage2.Controls.Add(labelС);
tabControl1.TabPages.Add(tabPage2);
TabPage tabPage3 = new TabPage("Компьютерия");
PictureBox pictureBox3 = new PictureBox();
pictureBox3.SizeMode = PictureBoxSizeMode.StretchImage;
pictureBox3.Image = new Bitmap("..//..//images//terra.jpg");
pictureBox3.Size = new Size(300, 200);
tabPage3.Controls.Add(pictureBox3);
Label labelT = new Label();
labelT.Top = 200;
labelT.Size = new Size(300, 50);
labelT.Text = "Это страна Компьютерия!" +
" Она расположена на берегу реки Тверца в Тверской области!";
tabPage3.Controls.Add(labelT);
tabControl1.TabPages.Add(tabPage3);
panel1.Controls.Add(tabControl1);
}
else if (e.Node.Text == "PictureBox")
{
// Добавляем на панель изображение
PictureBox pictureBox1 = new PictureBox();
pictureBox1.Image = new Bitmap("..//..//images//Zakat.jpg");
pictureBox1.BorderStyle = BorderStyle.Fixed3D;
pictureBox1.Location = new Point(500, 250);
pictureBox1.Size = new Size(250, 200);
panel1.Controls.Add(pictureBox1);
}
else if (e.Node.Text == "RichTextBox")
{
// Добавляем поле для ввода текста с форматированием
// Загружаем в него данные из файла XML
RichTextBox richTextBox1 = new RichTextBox();
richTextBox1.LoadFile("..//..//images//marks.xml",
RichTextBoxStreamType.UnicodePlainText);
richTextBox1.WordWrap = false;
richTextBox1.BorderStyle = BorderStyle.Fixed3D;
richTextBox1.BackColor = Color.Beige;
richTextBox1.Size = new Size(250, 150);
richTextBox1.Location = new Point(300, 500);
// panel1.Height - richTextBox1.Height - 5);
panel1.Controls.Add(richTextBox1);
}
else if (e.Node.Text == "MainMenu")
{
// Добавляем классическое "меню" (появляется в верхней части окна)
MainMenu mainMenu1 = new MainMenu();
MenuItem menuItem1 = new MenuItem("File");
menuItem1.MenuItems.Add("Exit",
new EventHandler(mainMenu1_Exit_Select));
mainMenu1.MenuItems.Add(menuItem1);
MenuItem menuItem2 = new MenuItem("Background");
menuItem2.MenuItems.Add("Choose",
new EventHandler(mainMenu1_ColorOwn_Select));
menuItem2.MenuItems.Add("White",
new EventHandler(mainMenu1_ColorWhite_Select));
mainMenu1.MenuItems.Add(menuItem2);
this.Menu = mainMenu1;
MessageBox.Show("Главное меню добавлено в окно " +
"Испытайте его после нажатия OK.");
}
else if (e.Node.Text == "ToolBar")
{
// Добавляем на панель элемент "панель управления" с кнопками
// быстрого вызова
ToolBar toolBar1 = new ToolBar();
toolBar1.Size = new Size(100, 100);
toolBar1.Dock = DockStyle.Right;
ImageList imageList1 = new ImageList();
imageList1.Images.Add(new Bitmap("../../images/new.gif"));
imageList1.Images.Add(new Bitmap("../../images/open.gif"));
imageList1.Images.Add(new Bitmap("../../images/copy.gif"));
toolBar1.ImageList = imageList1;
ToolBarButton toolBarbutton1 = new ToolBarButton("New");
toolBarbutton1.ImageIndex = 0;
toolBar1.Buttons.Add(toolBarbutton1);
ToolBarButton toolBarbutton2 = new ToolBarButton("Open");
toolBarbutton2.ImageIndex = 1;
toolBar1.Buttons.Add(toolBarbutton2);
ToolBarButton toolBarButton3 = new ToolBarButton("Copy");
toolBarButton3.ImageIndex = 2;
toolBar1.Buttons.Add(toolBarButton3);
toolBar1.ButtonClick +=
new ToolBarButtonClickEventHandler(toolBar1_Click);
panel1.Controls.Add(toolBar1);
}
}
/* Обработчики событий для добавленных выше элементов управления */
// Обработчик события, срабатывающий при щелчке мышью на метке
void label1_Click(object sender, System.EventArgs e)
{
MessageBox.Show
("Да, у меток тоже есть событие Click. Но для них включение событий -
редкость.");
}
// Обработчик события, срабатывающий при нажатии кнопки
void button1_Click(object sender, System.EventArgs e)
{
MessageBox.Show("Пора, наконец-то вы нажали меня!");
}
// Обработчик события, срабатывающий при установке или снятии флажка
void CheckBox_CheckedChanged(object sender, System.EventArgs e)
{
if (checkBox1.Checked checkBox2.Checked)
{
MessageBox.Show("У Вас все получится!");
}
else if (checkBox1.Checked)
{
MessageBox.Show("Не здорово быть умным и не скромным!");
}
else if (checkBox2.Checked)
{
MessageBox.Show("Скромность украшает. Хорошо бы еще быть умным!");
}
else
{
MessageBox.Show("Ни скромности, ни таланта?");
}
}
// Обработчик события, срабатывающий при нажатии переключателя
void RadioButton_CheckedChanged(object sender, System.EventArgs e)
{
if (radioButton1.Checked)
{
MessageBox.Show("Доброту все любят!");
}
else if (radioButton2.Checked)
{
MessageBox.Show("Это замечательно!");
}
}
// Обработчик события, срабатывающий при выборе одного из пунктов списка
void listBox1_SelectedIndexChanged(object sender, System.EventArgs e)
{
switch (listBox1.SelectedItem.ToString())
{
case ("Зеленый"): treeView1.BackColor = Color.Green; break;
case ("Желтый"): treeView1.BackColor = Color.Yellow; break;
case ("Голубой"): treeView1.BackColor = Color.Blue; break;
case ("Серый"): treeView1.BackColor = Color.Gray; break;
}
}
// Обработчик события, срабатывающий при выборе в меню пункта "White"
void mainMenu1_ColorWhite_Select(object sender, System.EventArgs e)
{
treeView1.BackColor = Color.White;
}
// Обработчик события, срабатывающий при выборе в меню цвета
void mainMenu1_ColorOwn_Select(object sender, System.EventArgs e)
{
ColorDialog colorDialog1 = new ColorDialog();
colorDialog1.Color = treeView1.BackColor;
colorDialog1.ShowDialog();
treeView1.BackColor = colorDialog1.Color;
}
// Обработчик события, срабатывающий при выборе в меню пункта "exit"
void mainMenu1_Exit_Select(object sender, System.EventArgs e)
{
if (
MessageBox.Show("Вы уверены, что хотите закончить работу?",
"Exit confirmation", MessageBoxButtons.YesNo)
== DialogResult.Yes
)
{
this.Dispose();
}
}
// Обработчик события, срабатывающий при нажатии кнопки на панели инструментов
void toolBar1_Click
(object sender, System.Windows.Forms.ToolBarButtonClickEventArgs e)
{
if (e.Button.Text == "Open")
{
MessageBox.Show("Здесь мог бы открываться файл!");
}
else if (e.Button.Text == "New")
{
MessageBox.Show("Здесь мог бы создаваться файл!");
}
else if (e.Button.Text == "Copy")
{
MessageBox.Show("Здесь мог бы копироваться файл!");
}
}
static void Main()
{
// // Создаем и запускаем форму
Application.Run(new FormWithManyControls());
}
}
Классы, объединенные в пространство имен Drawing, позволяют работать с различными изображениями. Существует два основных типа компьютерных изображений.
Растровые представляют собой набор точек. Примером могут служить фотографии и значки.
Для начала продемонстрируем работу с
Пример программы 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.9
Следующая программа загружает фотографию с диска и после нажатия кнопки "
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 = "Рисунок после поворота!";
}
}

Теперь перейдем к примерам работы с
Во всех примерах будут создаваться кнопка и обработчик событий, отвечающий за то, чтобы работа с графикой начиналась только после нажатия кнопки.
Необходимо усвоить несколько важных принципов. Они вполне логичны, но все-таки следует уяснить их, чтобы избежать возможных затруднений.
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.11
Теперь попробуем поиграть с мышкой – работать с графикой удобнее при помощи мыши, а не клавиатуры. Мы будем обрабатывать как растровые, так и векторные изображения, используя некоторые события мыши.
Постараемся освоить некоторые новые действия, а именно — действия с точечными рисунками. Тратить время на подробное описание мы не будем, но небольшое вступление необходимо, чтобы рассказать о принципах работы приведенного ниже кода.
red=255, green=0, blue=0 — цвет пикселя будет ярко-красным;red=255, green=255, blue=0 — цвет пикселя желтый.X и Y (горизонтальная и вертикальная координаты). Так, верхний левый угол экрана имеет координаты X=0 и Y=0.using System;
using System.Windows.Forms;
using System.Drawing;
class FunWithTheMouse : Form
{
// Объявляем объекты, доступные для разных методов
PictureBox pictureBox1;
Label label1;
Point spotClicked;
// Метод-конструктор нашего класса
public FunWithTheMouse()
{
// Задаем размеры окна
this.Size = new Size(640, 480);
// Загружаем рисунок в элемент PictureBox и вставляем в форму
pictureBox1 = new PictureBox();
pictureBox1.Image = (Image)new Bitmap(@"../../images/Dog.bmp");
pictureBox1.SizeMode = PictureBoxSizeMode.Normal;
pictureBox1.Dock = DockStyle.Fill;
this.Controls.Add(pictureBox1);
// Добавляем метку с инструкциями в нижнюю часть экрана
label1 = new Label();
label1.BackColor = Color.Wheat;
label1.Dock = DockStyle.Bottom;
label1.Text =
"При нажатой левой кнопке мыши можно рисовать прямоугольники. " +
"Нажатая правая кнопка изменяет яркость прямоугольника " +
"Нажав SHIFT и перемещая мышь, рисуем желтые кружки.";
label1.TextAlign = ContentAlignment.MiddleCenter;
this.Controls.Add(label1);
// Привязываем PictureBox к обработчикам событий мыши
this.pictureBox1.MouseDown += new MouseEventHandler(MouseButtonIsDown);
this.pictureBox1.MouseUp += new MouseEventHandler(MouseButtonIsUp);
this.pictureBox1.MouseMove += new MouseEventHandler(TheMouseMoved);
}
// Обработчик событий, срабатывающий при ПЕРЕМЕЩЕНИИ мыши
public void TheMouseMoved(object sender, MouseEventArgs e)
{
// Если на клавиатуре нажата клавиша SHIFT
if ((Control.ModifierKeys Keys.Shift) == Keys.Shift)
{
// Подготовка области рисования на изображении
System.Drawing.Graphics g =
this.pictureBox1.CreateGraphics();
// Используем желтое перо
System.Drawing.Pen yellowPen = new
System.Drawing.Pen(Color.Yellow, 3);
// Рисуем окружность (эллипс, вписанный в квадрат)
// Верхний левый угол квадрата имеет координаты X и Y
// текущего положения мыши.
g.DrawEllipse(yellowPen, e.X, e.Y, 40, 40);
// Очистка
g.Dispose();
}
}
// Обработчик событий, срабатывающий при НАЖАТИИ кнопки мыши
public void MouseButtonIsDown(object sender, MouseEventArgs e)
{
// Запоминаем точку, в которой произошло нажатие кнопки мыши.
// Когда кнопка будет отпущена, нам понадобятся ее координаты
spotClicked.X = e.X;// горизонтальная координата
spotClicked.Y = e.Y;// вертикальная координата
}
// Обработчик событий, срабатывающий при ОТЖАТИИ кнопки мыши
public void MouseButtonIsUp(object sender, MouseEventArgs e)
{
/* Пользователь отпустил кнопку мыши! */
// Создаем прямоугольник (пока он еще не виден), ограничивающий
// область изображения, с которой пользователь будет работать
Rectangle r = new Rectangle();
// Левый верхний угол прямоугольника соответствует точке,
// в которой была нажата кнопка мыши.
// Мы сохранили ее координаты.
r.X = spotClicked.X;
r.Y = spotClicked.Y;
// Ширина и высота прямоугольника вычисляется
// путем вычитания координат мыши в точке нажатия
// из текущих координат (в точке отжатия кнопки).
r.Width = e.X – spotClicked.X;
r.Height = e.Y – spotClicked.Y;
if (e.Button == MouseButtons.Left)
{
/* Если была нажата и отпущена левая кнопка мыши,
рисуем видимый контур прямоугольника */
// Подготовка области рисования на изображении
Graphics g = this.pictureBox1.CreateGraphics();
// Рисуем красный контур прямоугольника
Pen redPen = new Pen(Color.Red, 2);
g.DrawRectangle(redPen, r);
}
else
{
// Если была нажата другая кнопка, вызываем
// метод, подсвечивающий область изображения
ChangeLightness(r);
}
}
// Метод, увеличивающий яркость выбранного участка изображения
// путем увеличения яркости каждого пикселя этого участка
public void ChangeLightness(Rectangle rect)
{
int newRed, newGreen, newBlue;
Color pixel;
// Копируем изображение, загруженное в PictureBox
System.Drawing.Bitmap picture = new
Bitmap(this.pictureBox1.Image);
// Операция увеличения яркости может занять много времени,
// пользователя предупреждают, если выбран большой участок.
if ((rect.Width > 150) || (rect.Height > 150))
{
DialogResult result = MessageBox.Show(
"Выделенная область велика! " +
"Изменение яркости может требовать значительного времени!",
"Warning", MessageBoxButtons.OKCancel);
// При нажатии кнопки Cancel (Отмена) выходим из метода
// и возвращаемся к месту его вызова
if (result == DialogResult.Cancel) return;
}
/* Перебираем последовательно все пиксели данного участка
и удваиваем значение яркости компонент RGB пикселей */
// Перебор по горизонтали слева направо...
for (int x = rect.X; x < rect.X + rect.Width; x++)
{
// и по вертикали сверху вниз...
for (int y = rect.Y; y < (rect.Y + rect.Height); y++)
{
// Считываем текущий пиксель
pixel = picture.GetPixel(x, y);
// Увеличиваем яркость цветовых компонент пикселя
newRed = (int)Math.Round(pixel.R * 2.0, 0);
if (newRed > 255) newRed = 255;
newGreen = (int)Math.Round(pixel.G * 2.0, 0);
if (newGreen > 255) newGreen = 255;
newBlue = (int)Math.Round(pixel.B * 2.0, 0);
if (newBlue > 255) newBlue = 255;
// Присваиваем пикселю новые цветовые значения
picture.SetPixel
(x, y, Color.FromArgb(
(byte)newRed, (byte)newGreen, (byte)newBlue));
}
}
// Помещаем измененную копию изображения в PictureBox,
// чтобы изменения отобразились на экране
this.pictureBox1.Image = picture;
}
static void Main()
{
// Создаем экземпляр класса формы
Application.Run(new FunWithTheMouse());
}
}
Программировать на языке C# без .NET Framework — это все равно что писать ручкой без чернил. Сколько ни води ею по бумаге, написать ничего не удастся.
Так что же такое .NET Framework? Это платформа программирования, разработанная корпорацией Microsoft, и язык C# создавался специально для нее. Платформа .NET Framework состоит из двух частей.
Итак, при написании программы на языке C# (или на любом другом языке .NET) наряду с созданием собственного кода используются классы, хранящиеся в библиотеке.

Библиотека .NET framework содержит огромное количество классов, и некоторые из них настолько сложны, что мы даже не будем пытаться рассмотреть все сразу. Расскажем лишь о тех, которые, на наш взгляд, наиболее полезны для начинающих программистов. Со временем вы станете запоминать классы, которыми пользуетесь чаще, чем другими, и постепенно хорошо их освоите. Ведь когда часто берешь в библиотеке любимую книгу, то легко запоминаешь, на какой полке ее искать.
Обращаю ваше внимание: в этой части курса приведено много примеров программ, которые вы должны сначала испытать в работе, а затем попытаться изменить их, чтобы добиться новых результатов. Ранее мы уже рассказывали, как запускать примеры, представленные на сайте в архиве, который Вы можете скачать в лекции 1.
Я слышу ваше возмущение: "Легко сказать: измени программу! Но откуда мне знать, в каком направлении двигаться? В приведенных примерах используются лишь некоторые методы и классы .NET Framework, но ведь их очень много! Как о них узнать?"
Для этого есть несколько способов:

Подсказка работает и для методов. Если поставите открывающую скобку после имени метода, то увидите типы параметров, которые он может принимать. Зачастую в C# используются одноименные методы с различными наборами параметров — в таком случае список надо "прокручивать" (перемещаться по нему) вверх и вниз при помощи клавиш с изображенными на них стрелками. В следующем примере показано, что произойдет, если набрать Console.WriteLine(. Visual C# Express подскажет о существовании 19 различных способов вызова метода WriteLine. Мы прокрутили список вниз до 11-й позиции (см. рисунок ниже).

Понятие "консоль" пришло к нам из тех времен, когда были популярны большие компьютеры, их называли мейнфреймами. Компания размещала в каком-нибудь помещении один гигантский компьютер, а на рабочих местах служащих устанавливалась только клавиатура и простенький монитор, называвшийся консолью. Клавиатура и монитор подключались к тому самому "монстру", спрятанному от посторонних глаз в отдельной комнате. Такие мониторы не умели отображать графику — только текст. Информация передавалась в

Сегодня мониторы большинства компьютеров имеют гораздо более совершенные возможности и способны отображать не только текст, но и, например, фотографии.
Однако при выполнении многих задач никаких графических изысков не требуется. Например, программа, получающая какие-либо данные с сервера в Интернете и сохраняющая их в файле на вашем компьютере, должна уметь выводить только два сообщения: "идет получение данных" и "готово". Зачем тратить время на разработку затейливого пользовательского интерфейса, который занимает много памяти? Именно по этой причине в библиотеку .NET включен класс для быстрого написания
Не стоит относиться снисходительно к
Конечно, если вашей программой будет пользоваться кто-то еще, то вы, вероятно, окажете ему большую услугу, сделав интерфейс чуть более дружественным, чем в стандартном
Некоторые полезные методы:
Console.ReadLine — считывает строку символов, введенную с клавиатуры (или иного устройства ввода).Console.WriteLine — выводит текст на экран (или иное устройство вывода) начиная с новой строки.Console.Write — выводит на экран ряд символов без перехода на новую строку.Пример программы 3.1
Следующая программа выводит на экран слово "Ура!" и после этого ожидает нажатия клавиши ВВОД.
using System;
class PleaseSayUra
{
static void Main()
{
// Выводим слово на экран
Console.Write("Ура!");
// Ожидаем нажатия клавиши ВВОД
Console.ReadLine();
}
}

Пример программы 3.2
Следующая программа:
using System;
class WriteAFewLines
{
static void Main()
{
Console.WriteLine("Введите Ваше любимое слово : ");
// Сохраняем в строковой переменной введенное пользователем слово
string favouriteWord = Console.ReadLine();
Console.WriteLine("Сколько раз его напечатать? ");
// Сохраняем в целочисленной переменной введенное число
// (При неправильном вводе числа произойдет ошибка)
int numberOfTimes = Convert.ToInt32(Console.ReadLine());
// Выводим на экран слово указанное количество раз
for (int i = 0; i < numberOfTimes; i++)
{
Console.WriteLine(favouriteWord);
}
// Ожидаем нажатия клавиши ВВОД
Console.ReadLine();
}
}

Если вы захотите писать программы, похожие на привычные приложения Windows, то наверняка воспользуетесь классами из пространства имен System.Windows.Forms. Они позволяют задействовать кнопки, списки, текстовые поля, меню, окна сообщений и множество других "элементов управления". Элементы управления — это то, что вы помещаете в форму. Они нужны для вывода информации, например, текстовой (элемент управления Label ) или графической (элемент управления PictureBox ), либо для выполнения определенных действий, например, выбора значения или перехода к другой форме после нажатия кнопки. Все элементы управления помещаются на форму.
Понятие "форма", принятое в программировании, родственно понятию "форма анкеты" или "форма документа" из обычной жизни. На форме можно в определенном порядке расположить различные

В программировании понятие формы во многом похоже: форма позволяет размещать текст, изображения, поля ввода, кнопки и т. п., добиваясь их точного расположения на экране. В
Компания Майкрософт предоставила в составе библиотеки классов .NET Framework огромное количество "элементов управления", которые можно помещать на формы. Освоив этот инструмент, вы сможете быстро создавать эффектные приложения.
Вот некоторые элементы управления, которые можно размещать на формах:
Возможно, вы предпочтете не использовать уже заготовленные примеры проектов, а разрабатывать их "с нуля". В таком случае нужно учесть, что для каждого проекта C# Express сразу же создает два файла (с именами Form1.cs и Program.cs ) и наполняет их исходным кодом на языке C#, то есть вы изначально получаете простейшую, но полноценную программу. Предлагаемый нами способ работы с уже полученным проектом состоит в выполнении следующих действий:
Оба этих действия не понадобятся, если вы открываете программы с помощью команды "Открыть проект" в меню "Файл" и находите нужный проект в той папке, куда его поместили после разархивации.
Пример программы 3.3
Рассмотрим пример простейшего приложения Windows Forms. Оно всего лишь создает новую форму и выводит определенный текст в заголовок окна формы.
using System.Windows.Forms;
class SimpleWindowsForm : Form
{
// Метод-конструктор нашего класса
public SimpleWindowsForm()
{
// Указываем заголовок окна
this.Text = "Это простая форма с заголовком";
}
static void Main()
{
// Создаем новый экземпляр класса
//и запускаем его на выполнение
// В результате на экране дисплея откроется форма
Application.Run(new SimpleWindowsForm());
}
}

Пример программы 3.4
Следующий пример тоже достаточно прост, но мы делаем шаг вперед — размещаем на форме кнопку.
using System.Windows.Forms;
class SimpleWindowsFormWithButton : Form
{
Button button1;
// Метод-конструктор нашего класса
public SimpleWindowsFormWithButton()
{
// Указываем заголовок окна
this.Text = "Форма с командной кнопкой";
// Добавляем кнопку в коллекцию элементов управления формы
// Хотя на кнопке написано: "Нажми меня!",
// пока при нажатии ничего не происходит!
button1 = new Button();
button1.Text = "Нажми меня!";
button1.Top = 100;
button1.Left = 100;
button1.Height = 50;
button1.Width = 70;
this.Controls.Add(button1);
}
static void Main()
{
// Создаем и запускаем форму
Application.Run(new SimpleWindowsFormWithButton());
}
}

Пример программы 3.5
Кнопку на форму мы поместили, но при нажатии на нее ничего не происходит. Это скучно.
Нам нужно описать метод, который будет выполнять какое-либо действие при нажатии на кнопку. Пусть при этом текст в заголовке окна будет меняться. Поскольку такой метод отслеживает наступление некоторого события (в нашем случае – нажатие на кнопку) и затем каким-то образом обрабатывает его, он, напомним, называется "обработчик события". Кроме того, надо привязать обработчик события к соответствующему событию, то есть к нажатию на кнопку.
using System;
using System.Windows.Forms;
using System.Drawing;
class FormWithWorkingButton : Form
{
Button mrButton;
// Метод-конструктор нашего класса
public FormWithWorkingButton()
{
// Указываем заголовок окна
this.Text = "Форма с работающей кнопкой!";
// Добавляем кнопку и привязываем ее к обработчику события
mrButton = new Button();
mrButton.Text = "Нажми меня";
mrButton.Top = 100;
mrButton.Left = 100;
mrButton.Height = 50;
mrButton.Width = 70;
mrButton.Click += new System.EventHandler(mrButton_Click);
this.Controls.Add(mrButton);
}
static void Main()
{
// Создаем и запускаем форму
Application.Run(new FormWithWorkingButton());
}
// Обработчик события, срабатывающий при нажатии кнопки
void mrButton_Click(object sender, EventArgs e)
{
// Изменяем текст
mrButton.Text = "Кнопка была нажата!";
}
}

Пример программы 3.6
Мы добились успеха: наша программа умеет выполнять основные действия. Теперь добавим на форму несколько новых элементов управления, аккуратно разместим их и немного поработаем с ними. Возьмем элементы управления 4-х типов: Button, ListBox, MessageBox и PictureBox.
Обратите внимание: кроме System.Windows.Forms в этом примере упоминается пространство имен System.Drawing. Дело в том, что мы используем элемент управления PictureBox, а для работы с изображениями требуются классы Drawing.
using System.Windows.Forms;
using System.Drawing;
class MyForm : Form
{
// Объявим элемент ListBox как поле класса:
// нам придется обращаться к нему из разных методов
ListBox listBox1;
// Метод-конструктор нашего класса
public MyForm()
{
//Размеры формы
this.Size = new Size(400, 400);
// Создадим элемент PictureBox, поместим в него изображение,
// добавим его на форму
PictureBox pictureBox1 = new PictureBox();
pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;
Bitmap image1 = new Bitmap ("..//..//images//Zakat.jpg");
pictureBox1.ClientSize = new Size(this.Width, 150);
pictureBox1.Image = (Image)image1;
this.Controls.Add(pictureBox1);
// Создаем объект Button, определяем некоторые из его свойств
Button button1 = new System.Windows.Forms.Button();
button1.Location = new Point(150, 160);
button1.Size = new Size(100, 30);
button1.Text = "Нажми меня";
button1.Click += new System.EventHandler(button1_Click);
this.Controls.Add(button1);
// Создаем ListBox, определяем свойства и добавляем на форму
listBox1 = new System.Windows.Forms.ListBox();
listBox1.Location = new System.Drawing.Point(20, 200);
listBox1.Size = new Size(100, 100);
listBox1.Items.Add("Лес");
listBox1.Items.Add("Степь ");
listBox1.Items.Add("Озеро");
listBox1.Items.Add("Море");
listBox1.Items.Add("Океан");
listBox1.SelectedIndex = 2;
this.Controls.Add(listBox1);
}
// Обработчик события, срабатывающий при нажатии кнопки
void button1_Click(object sender, System.EventArgs e)
{
// Выводим сообщение с указанием выбранного в списке пункта
MessageBox.Show(this, "Вы выбрали " + listBox1.SelectedItem,
"Уведомление", MessageBoxButtons.OK);
}
static void Main()
{
// Создаем и запускаем форму
Application.Run(new MyForm());
}
private void InitializeComponent()
{
this.SuspendLayout();
//
// MyForm
//
this.BackColor = System.Drawing.SystemColors.Control;
this.ClientSize = new System.Drawing.Size(292, 273);
this.Name = "MyForm";
this.ResumeLayout(false);
}
}

Пример программы 3.7
Итак, настала пора испытать свои силы. Попробуем написать одну действительно большую программу, используя целый ряд полезных элементов управления. Объем кода может показаться пугающе большим, но программа вам пригодится, когда нужно будет вспомнить, для чего нужен тот или иной элемент управления.
Программа весьма интересна и стоит того, чтобы вы тщательно с ней поработали. После ее запуска открывается форма, в которой меню построено при помощи
Досконально разбирать текст всей программы необязательно, но когда у вас возникнут вопросы по использованию, например, элемента CheckBox, вы можете просмотреть ту ее часть, которая касается этого элемента.
Напоминаем: для того чтобы использовать элементы управления PictureBox и DataGridView, требуются пространства имен System.Drawing, System.Data и System.Xml.
using System;
using System.Windows.Forms;
using System.Drawing;
using System.Data;
using System.Xml;
class FormWithManyControls : Form
{
TreeView treeView1;
Panel panel1;
CheckBox checkBox1, checkBox2;
RadioButton radioButton1, radioButton2;
ListBox listBox1;
// Метод-конструктор нашего класса
public FormWithManyControls()
{
// Указываем размеры и заголовок окна
this.Text = "Форма, включающая различные элементы управления!";
this.Height = 800; this.Width = 900;
// Добавляем элемент TreeView в качестве своеобразного меню
treeView1 = new TreeView();
treeView1.BackColor = Color.BurlyWood;
treeView1.Dock = DockStyle.Left;
treeView1.AfterSelect +=
new System.Windows.Forms.TreeViewEventHandler(treeView1_AfterSelect);
TreeNode tn = new TreeNode("Элементы");
tn.Expand();
tn.Nodes.Add(new TreeNode("[Очистить]"));
tn.Nodes.Add(new TreeNode("Label"));
tn.Nodes.Add(new TreeNode("Button"));
tn.Nodes.Add(new TreeNode("CheckBox"));
tn.Nodes.Add(new TreeNode("RadioButton"));
tn.Nodes.Add(new TreeNode("ListBox"));
tn.Nodes.Add(new TreeNode("TextBox"));
tn.Nodes.Add(new TreeNode("TabControl"));
tn.Nodes.Add(new TreeNode("DataGridView"));
tn.Nodes.Add(new TreeNode("MainMenu"));
tn.Nodes.Add(new TreeNode("ToolBar"));
tn.Nodes.Add(new TreeNode("PictureBox"));
tn.Nodes.Add(new TreeNode("RichTextBox"));
treeView1.Nodes.Add(tn);
this.Controls.Add(treeView1);
// Добавляем панель для размещения остальных элементов управления
panel1 = new Panel();
panel1.Dock = DockStyle.Right;
panel1.BorderStyle = BorderStyle.Fixed3D;
panel1.Width = this.Width - treeView1.Width;
this.Controls.Add(panel1);
}
// Обработчик событий, срабатывающий при выборе одного из узлов дерева
// TreeView
private void treeView1_AfterSelect
(object sender, System.Windows.Forms.TreeViewEventArgs e)
{
// Выполнение соответствующего действия при выборе любого из узлов
if (e.Node.Text == "[Очистить]")
{
// Удаляем с панели все элементы управления
panel1.Controls.Clear();
}
else if (e.Node.Text == "Button")
{
// Добавляем на панель кнопку
Button button1 = new Button();
button1.Text = "Нажми меня!";
button1.Location = new Point(300, 20);
button1.Width = 120;
button1.Height = 40;
button1.Click += new EventHandler(button1_Click);
panel1.Controls.Add(button1);
}
else if (e.Node.Text == "Label")
{
// Добавляем на панель метку
Label label1 = new Label();
label1.Text =
"Это надпись. Используется для вывода текста на экран!";
label1.Location = new Point(180, 70);
label1.Width = 400;
label1.Click += new EventHandler(label1_Click);
panel1.Controls.Add(label1);
}
else if (e.Node.Text == "CheckBox")
{
// Добавляем на панель несколько флажков
checkBox1 = new CheckBox();
checkBox1.Text = "Я способный!";
checkBox1.Location = new Point(20, 40);
checkBox1.Width = 150;
checkBox1.CheckedChanged +=
new EventHandler(CheckBox_CheckedChanged);
panel1.Controls.Add(checkBox1);
checkBox2 = new CheckBox();
checkBox2.Text = "Я скромный!";
checkBox2.Location = new Point(20, 80);
checkBox2.Width = 150;
checkBox2.CheckedChanged +=
new EventHandler(CheckBox_CheckedChanged);
panel1.Controls.Add(checkBox2);
}
else if (e.Node.Text == "RadioButton")
{
// Добавляем на панель несколько переключателей
radioButton1 = new RadioButton();
radioButton1.Text = "Я добрый!";
radioButton1.Location = new Point(20, 120);
radioButton1.Width = 150;
radioButton1.Height = 30;
//radioButton1.Size = new Size(20, 100);
radioButton1.CheckedChanged +=
new EventHandler(RadioButton_CheckedChanged);
panel1.Controls.Add(radioButton1);
radioButton2 = new RadioButton();
radioButton2.Text = "Я трудолюбивый!";
radioButton2.Location = new Point(20, 160);
radioButton2.Width = 150;
radioButton2.Height = 30;
//radioButton2.Size = new Size(20, 100);
radioButton2.CheckedChanged +=
new EventHandler(RadioButton_CheckedChanged);
panel1.Controls.Add(radioButton2);
}
else if (e.Node.Text == "ListBox")
{
// Добавляем на панель список
listBox1 = new ListBox();
listBox1.Items.Add("Зеленый");
listBox1.Items.Add("Желтый");
listBox1.Items.Add("Голубой");
listBox1.Items.Add("Серый");
listBox1.Location = new Point(20, 250);
listBox1.Width = 100; listBox1.Height = 100;
listBox1.SelectedIndexChanged +=
new EventHandler(listBox1_SelectedIndexChanged);
panel1.Controls.Add(listBox1);
}
else if (e.Node.Text == "TextBox")
{
// Добавляем на панель текстовое поле
TextBox textBox1 = new TextBox();
textBox1.Multiline = true;
textBox1.Text = "Это текстовое окно. Сюда можно вводить текст!" +
"\r\n" + " Сотрите этот текст и введите свой!";
textBox1.Location = new Point(180, 100);
textBox1.Width = 400; textBox1.Height = 40;
panel1.Controls.Add(textBox1);
}
else if (e.Node.Text == "DataGridView")
{
// Добавляем на панель таблицу, заполненную данными из файла xml
DataSet dataSet1 = new DataSet("Пример DataSet");
dataSet1.ReadXml("..//..//images//marks.xml");
DataGridView dataGridView1 = new DataGridView();
dataGridView1.Width = 250;
dataGridView1.Height = 150;
dataGridView1.Location = new Point(20, 500);
dataGridView1.AutoGenerateColumns = true;
dataGridView1.DataSource = dataSet1;
dataGridView1.DataMember = "предметы";
//dataGridView1.DataMember = "оценка";
//dataGridView1.ColumnCount = 2;
panel1.Controls.Add(dataGridView1);
}
else if (e.Node.Text == "TabControl")
{
// Добавляем на панель элемент управления вкладками
// и наполняем каждую вкладку содержимым
TabControl tabControl1 = new TabControl();
tabControl1.Location = new Point(190, 150);
tabControl1.Size = new Size(300, 300);
TabPage tabPage1 = new TabPage("Вадик");
PictureBox pictureBox1 = new PictureBox();
pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;
pictureBox1.Image = new Bitmap("..//..//images//Vadik.jpg");
pictureBox1.Size = new Size(300, 200);
tabPage1.Controls.Add(pictureBox1);
Label labelV = new Label();
labelV.Top = 200;
labelV.Size = new Size(300, 50);
labelV.Text = "Это Вадик! Он любит купаться и работать на компьютере!";
tabPage1.Controls.Add(labelV);
tabControl1.TabPages.Add(tabPage1);
TabPage tabPage2 = new TabPage("Его компьютер");
PictureBox pictureBox2 = new PictureBox();
pictureBox2.SizeMode = PictureBoxSizeMode.StretchImage;
pictureBox2.Image = new Bitmap("..//..//images//comp.jpg");
pictureBox2.Size = new Size(300, 200);
tabPage2.Controls.Add(pictureBox2);
Label labelС = new Label();
labelС.Top = 200;
labelС.Size = new Size(300, 50);
labelС.Text = "Это компьютер Вадика! Пока Вадик купается, " +
"он разрешает работать на компьютере ящерице!";
tabPage2.Controls.Add(labelС);
tabControl1.TabPages.Add(tabPage2);
TabPage tabPage3 = new TabPage("Компьютерия");
PictureBox pictureBox3 = new PictureBox();
pictureBox3.SizeMode = PictureBoxSizeMode.StretchImage;
pictureBox3.Image = new Bitmap("..//..//images//terra.jpg");
pictureBox3.Size = new Size(300, 200);
tabPage3.Controls.Add(pictureBox3);
Label labelT = new Label();
labelT.Top = 200;
labelT.Size = new Size(300, 50);
labelT.Text = "Это страна Компьютерия!" +
" Она расположена на берегу реки Тверца в Тверской области!";
tabPage3.Controls.Add(labelT);
tabControl1.TabPages.Add(tabPage3);
panel1.Controls.Add(tabControl1);
}
else if (e.Node.Text == "PictureBox")
{
// Добавляем на панель изображение
PictureBox pictureBox1 = new PictureBox();
pictureBox1.Image = new Bitmap("..//..//images//Zakat.jpg");
pictureBox1.BorderStyle = BorderStyle.Fixed3D;
pictureBox1.Location = new Point(500, 250);
pictureBox1.Size = new Size(250, 200);
panel1.Controls.Add(pictureBox1);
}
else if (e.Node.Text == "RichTextBox")
{
// Добавляем поле для ввода текста с форматированием
// Загружаем в него данные из файла XML
RichTextBox richTextBox1 = new RichTextBox();
richTextBox1.LoadFile("..//..//images//marks.xml",
RichTextBoxStreamType.UnicodePlainText);
richTextBox1.WordWrap = false;
richTextBox1.BorderStyle = BorderStyle.Fixed3D;
richTextBox1.BackColor = Color.Beige;
richTextBox1.Size = new Size(250, 150);
richTextBox1.Location = new Point(300, 500);
// panel1.Height - richTextBox1.Height - 5);
panel1.Controls.Add(richTextBox1);
}
else if (e.Node.Text == "MainMenu")
{
// Добавляем классическое "меню" (появляется в верхней части окна)
MainMenu mainMenu1 = new MainMenu();
MenuItem menuItem1 = new MenuItem("File");
menuItem1.MenuItems.Add("Exit",
new EventHandler(mainMenu1_Exit_Select));
mainMenu1.MenuItems.Add(menuItem1);
MenuItem menuItem2 = new MenuItem("Background");
menuItem2.MenuItems.Add("Choose",
new EventHandler(mainMenu1_ColorOwn_Select));
menuItem2.MenuItems.Add("White",
new EventHandler(mainMenu1_ColorWhite_Select));
mainMenu1.MenuItems.Add(menuItem2);
this.Menu = mainMenu1;
MessageBox.Show("Главное меню добавлено в окно " +
"Испытайте его после нажатия OK.");
}
else if (e.Node.Text == "ToolBar")
{
// Добавляем на панель элемент "панель управления" с кнопками
// быстрого вызова
ToolBar toolBar1 = new ToolBar();
toolBar1.Size = new Size(100, 100);
toolBar1.Dock = DockStyle.Right;
ImageList imageList1 = new ImageList();
imageList1.Images.Add(new Bitmap("../../images/new.gif"));
imageList1.Images.Add(new Bitmap("../../images/open.gif"));
imageList1.Images.Add(new Bitmap("../../images/copy.gif"));
toolBar1.ImageList = imageList1;
ToolBarButton toolBarbutton1 = new ToolBarButton("New");
toolBarbutton1.ImageIndex = 0;
toolBar1.Buttons.Add(toolBarbutton1);
ToolBarButton toolBarbutton2 = new ToolBarButton("Open");
toolBarbutton2.ImageIndex = 1;
toolBar1.Buttons.Add(toolBarbutton2);
ToolBarButton toolBarButton3 = new ToolBarButton("Copy");
toolBarButton3.ImageIndex = 2;
toolBar1.Buttons.Add(toolBarButton3);
toolBar1.ButtonClick +=
new ToolBarButtonClickEventHandler(toolBar1_Click);
panel1.Controls.Add(toolBar1);
}
}
/* Обработчики событий для добавленных выше элементов управления */
// Обработчик события, срабатывающий при щелчке мышью на метке
void label1_Click(object sender, System.EventArgs e)
{
MessageBox.Show
("Да, у меток тоже есть событие Click. Но для них включение событий -
редкость.");
}
// Обработчик события, срабатывающий при нажатии кнопки
void button1_Click(object sender, System.EventArgs e)
{
MessageBox.Show("Пора, наконец-то вы нажали меня!");
}
// Обработчик события, срабатывающий при установке или снятии флажка
void CheckBox_CheckedChanged(object sender, System.EventArgs e)
{
if (checkBox1.Checked checkBox2.Checked)
{
MessageBox.Show("У Вас все получится!");
}
else if (checkBox1.Checked)
{
MessageBox.Show("Не здорово быть умным и не скромным!");
}
else if (checkBox2.Checked)
{
MessageBox.Show("Скромность украшает. Хорошо бы еще быть умным!");
}
else
{
MessageBox.Show("Ни скромности, ни таланта?");
}
}
// Обработчик события, срабатывающий при нажатии переключателя
void RadioButton_CheckedChanged(object sender, System.EventArgs e)
{
if (radioButton1.Checked)
{
MessageBox.Show("Доброту все любят!");
}
else if (radioButton2.Checked)
{
MessageBox.Show("Это замечательно!");
}
}
// Обработчик события, срабатывающий при выборе одного из пунктов списка
void listBox1_SelectedIndexChanged(object sender, System.EventArgs e)
{
switch (listBox1.SelectedItem.ToString())
{
case ("Зеленый"): treeView1.BackColor = Color.Green; break;
case ("Желтый"): treeView1.BackColor = Color.Yellow; break;
case ("Голубой"): treeView1.BackColor = Color.Blue; break;
case ("Серый"): treeView1.BackColor = Color.Gray; break;
}
}
// Обработчик события, срабатывающий при выборе в меню пункта "White"
void mainMenu1_ColorWhite_Select(object sender, System.EventArgs e)
{
treeView1.BackColor = Color.White;
}
// Обработчик события, срабатывающий при выборе в меню цвета
void mainMenu1_ColorOwn_Select(object sender, System.EventArgs e)
{
ColorDialog colorDialog1 = new ColorDialog();
colorDialog1.Color = treeView1.BackColor;
colorDialog1.ShowDialog();
treeView1.BackColor = colorDialog1.Color;
}
// Обработчик события, срабатывающий при выборе в меню пункта "exit"
void mainMenu1_Exit_Select(object sender, System.EventArgs e)
{
if (
MessageBox.Show("Вы уверены, что хотите закончить работу?",
"Exit confirmation", MessageBoxButtons.YesNo)
== DialogResult.Yes
)
{
this.Dispose();
}
}
// Обработчик события, срабатывающий при нажатии кнопки на панели инструментов
void toolBar1_Click
(object sender, System.Windows.Forms.ToolBarButtonClickEventArgs e)
{
if (e.Button.Text == "Open")
{
MessageBox.Show("Здесь мог бы открываться файл!");
}
else if (e.Button.Text == "New")
{
MessageBox.Show("Здесь мог бы создаваться файл!");
}
else if (e.Button.Text == "Copy")
{
MessageBox.Show("Здесь мог бы копироваться файл!");
}
}
static void Main()
{
// // Создаем и запускаем форму
Application.Run(new FormWithManyControls());
}
}
Классы, объединенные в пространство имен Drawing, позволяют работать с различными изображениями. Существует два основных типа компьютерных изображений.
Растровые представляют собой набор точек. Примером могут служить фотографии и значки.
Для начала продемонстрируем работу с
Пример программы 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.9
Следующая программа загружает фотографию с диска и после нажатия кнопки "
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 = "Рисунок после поворота!";
}
}

Теперь перейдем к примерам работы с
Во всех примерах будут создаваться кнопка и обработчик событий, отвечающий за то, чтобы работа с графикой начиналась только после нажатия кнопки.
Необходимо усвоить несколько важных принципов. Они вполне логичны, но все-таки следует уяснить их, чтобы избежать возможных затруднений.
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.11
Теперь попробуем поиграть с мышкой – работать с графикой удобнее при помощи мыши, а не клавиатуры. Мы будем обрабатывать как растровые, так и векторные изображения, используя некоторые события мыши.
Постараемся освоить некоторые новые действия, а именно — действия с точечными рисунками. Тратить время на подробное описание мы не будем, но небольшое вступление необходимо, чтобы рассказать о принципах работы приведенного ниже кода.
red=255, green=0, blue=0 — цвет пикселя будет ярко-красным;red=255, green=255, blue=0 — цвет пикселя желтый.X и Y (горизонтальная и вертикальная координаты). Так, верхний левый угол экрана имеет координаты X=0 и Y=0.using System;
using System.Windows.Forms;
using System.Drawing;
class FunWithTheMouse : Form
{
// Объявляем объекты, доступные для разных методов
PictureBox pictureBox1;
Label label1;
Point spotClicked;
// Метод-конструктор нашего класса
public FunWithTheMouse()
{
// Задаем размеры окна
this.Size = new Size(640, 480);
// Загружаем рисунок в элемент PictureBox и вставляем в форму
pictureBox1 = new PictureBox();
pictureBox1.Image = (Image)new Bitmap(@"../../images/Dog.bmp");
pictureBox1.SizeMode = PictureBoxSizeMode.Normal;
pictureBox1.Dock = DockStyle.Fill;
this.Controls.Add(pictureBox1);
// Добавляем метку с инструкциями в нижнюю часть экрана
label1 = new Label();
label1.BackColor = Color.Wheat;
label1.Dock = DockStyle.Bottom;
label1.Text =
"При нажатой левой кнопке мыши можно рисовать прямоугольники. " +
"Нажатая правая кнопка изменяет яркость прямоугольника " +
"Нажав SHIFT и перемещая мышь, рисуем желтые кружки.";
label1.TextAlign = ContentAlignment.MiddleCenter;
this.Controls.Add(label1);
// Привязываем PictureBox к обработчикам событий мыши
this.pictureBox1.MouseDown += new MouseEventHandler(MouseButtonIsDown);
this.pictureBox1.MouseUp += new MouseEventHandler(MouseButtonIsUp);
this.pictureBox1.MouseMove += new MouseEventHandler(TheMouseMoved);
}
// Обработчик событий, срабатывающий при ПЕРЕМЕЩЕНИИ мыши
public void TheMouseMoved(object sender, MouseEventArgs e)
{
// Если на клавиатуре нажата клавиша SHIFT
if ((Control.ModifierKeys Keys.Shift) == Keys.Shift)
{
// Подготовка области рисования на изображении
System.Drawing.Graphics g =
this.pictureBox1.CreateGraphics();
// Используем желтое перо
System.Drawing.Pen yellowPen = new
System.Drawing.Pen(Color.Yellow, 3);
// Рисуем окружность (эллипс, вписанный в квадрат)
// Верхний левый угол квадрата имеет координаты X и Y
// текущего положения мыши.
g.DrawEllipse(yellowPen, e.X, e.Y, 40, 40);
// Очистка
g.Dispose();
}
}
// Обработчик событий, срабатывающий при НАЖАТИИ кнопки мыши
public void MouseButtonIsDown(object sender, MouseEventArgs e)
{
// Запоминаем точку, в которой произошло нажатие кнопки мыши.
// Когда кнопка будет отпущена, нам понадобятся ее координаты
spotClicked.X = e.X;// горизонтальная координата
spotClicked.Y = e.Y;// вертикальная координата
}
// Обработчик событий, срабатывающий при ОТЖАТИИ кнопки мыши
public void MouseButtonIsUp(object sender, MouseEventArgs e)
{
/* Пользователь отпустил кнопку мыши! */
// Создаем прямоугольник (пока он еще не виден), ограничивающий
// область изображения, с которой пользователь будет работать
Rectangle r = new Rectangle();
// Левый верхний угол прямоугольника соответствует точке,
// в которой была нажата кнопка мыши.
// Мы сохранили ее координаты.
r.X = spotClicked.X;
r.Y = spotClicked.Y;
// Ширина и высота прямоугольника вычисляется
// путем вычитания координат мыши в точке нажатия
// из текущих координат (в точке отжатия кнопки).
r.Width = e.X – spotClicked.X;
r.Height = e.Y – spotClicked.Y;
if (e.Button == MouseButtons.Left)
{
/* Если была нажата и отпущена левая кнопка мыши,
рисуем видимый контур прямоугольника */
// Подготовка области рисования на изображении
Graphics g = this.pictureBox1.CreateGraphics();
// Рисуем красный контур прямоугольника
Pen redPen = new Pen(Color.Red, 2);
g.DrawRectangle(redPen, r);
}
else
{
// Если была нажата другая кнопка, вызываем
// метод, подсвечивающий область изображения
ChangeLightness(r);
}
}
// Метод, увеличивающий яркость выбранного участка изображения
// путем увеличения яркости каждого пикселя этого участка
public void ChangeLightness(Rectangle rect)
{
int newRed, newGreen, newBlue;
Color pixel;
// Копируем изображение, загруженное в PictureBox
System.Drawing.Bitmap picture = new
Bitmap(this.pictureBox1.Image);
// Операция увеличения яркости может занять много времени,
// пользователя предупреждают, если выбран большой участок.
if ((rect.Width > 150) || (rect.Height > 150))
{
DialogResult result = MessageBox.Show(
"Выделенная область велика! " +
"Изменение яркости может требовать значительного времени!",
"Warning", MessageBoxButtons.OKCancel);
// При нажатии кнопки Cancel (Отмена) выходим из метода
// и возвращаемся к месту его вызова
if (result == DialogResult.Cancel) return;
}
/* Перебираем последовательно все пиксели данного участка
и удваиваем значение яркости компонент RGB пикселей */
// Перебор по горизонтали слева направо...
for (int x = rect.X; x < rect.X + rect.Width; x++)
{
// и по вертикали сверху вниз...
for (int y = rect.Y; y < (rect.Y + rect.Height); y++)
{
// Считываем текущий пиксель
pixel = picture.GetPixel(x, y);
// Увеличиваем яркость цветовых компонент пикселя
newRed = (int)Math.Round(pixel.R * 2.0, 0);
if (newRed > 255) newRed = 255;
newGreen = (int)Math.Round(pixel.G * 2.0, 0);
if (newGreen > 255) newGreen = 255;
newBlue = (int)Math.Round(pixel.B * 2.0, 0);
if (newBlue > 255) newBlue = 255;
// Присваиваем пикселю новые цветовые значения
picture.SetPixel
(x, y, Color.FromArgb(
(byte)newRed, (byte)newGreen, (byte)newBlue));
}
}
// Помещаем измененную копию изображения в PictureBox,
// чтобы изменения отобразились на экране
this.pictureBox1.Image = picture;
}
static void Main()
{
// Создаем экземпляр класса формы
Application.Run(new FunWithTheMouse());
}
}
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.