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

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

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

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

Добавлен: 11.01.2024

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

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

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
Вывод изображения с возможностью прокрутки

Убедиться в работоспособности данной программы можно, открыв соответст вующее решение в папке БольшойРисунокСкроллинг.

Пример 32. Рисование в форме указателем мыши

В данном примере покажем, как можно рисовать мышью в форме. То есть задача состоит в том, чтобы написать программу, позволяющую при нажатой левой или правой кнопке мыши рисовать в форме. Если пользователь отпустит кнопку мыши, то рисование прекращается. В проектируемой форме следует предусмотрет» кнопку Стереть, которая предназначена для очистки формы.

Вначале надо создать форму с командной кнопкой, как мы это делали прежде. Текст программы представлен в листинге 5.5.

Листинг 5.5. Рисование на форме указателем мыши

// Программа позволяет при нажатой левой или правой кнопке мыши рисовать в форме

using System;

using System.Drawing;

using System.Windows.Forms;

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

namesрасе РисМьшью

{

public partial class Form1 : Form

{

bool Рисовать_ли = false; //He рисовать

public Form1()

{

InitializeComponent();

this.Text = "Рисую мышью в форме";

button1.Text = "Стереть";

}

private void Form1_MouseDown(object sender, MouseEventArgs e)

{ // Если нажата кнопка мыши - MouseDown, то рисовать

Рисовать_ли = true;

}

private void Form1_MouseUp(object sender, MouseEventArgs e)

{ // Если кнопку мыши отпустили, то НЕ рисовать

Рисовать_ли = false;

}

private void Form1_MouseMove(object sender, MouseEventArgs e)

{ // Рисование прямоугольника, если нажата кнопка мыши

if (Рисовать_ли == true)

{ // Рисовать прямоугольник в точке (е.Х, e.Y)

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

Графика.FillRectangle(new SolidBrush(Color.Red), e.X, e.Y, 10, 10);

// 10x10 пикселов — размер сплошного прямоугольника

// е.Х, e.Y — координаты указателя мыши

}

private void button1_Click(object sender, EventArgs e)

{ // Стереть, методы очистки формы:

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

Графика. Clear (SystemColors. Control);

// Графика.Clear(Color.FromName("Control"));

// Графика.Clear(Color.FromKnownColor(KnownColor.Control))

// Графика.Clear(ColorTranslator.FromHtml("#EFEBDE"));

// this.Refresh(); // Этот метод перерисовывает форму

)

}

}

Здесь в начале программы объявлена переменная Рисовать_ли логического типа (bool) со значением false. Эта переменная либо позволяет (Рисовать_ли = true) рисовать в форме при перемещении мыши (событие MouseMove), либо не разрешает делать это (Рисовать_ли = false). Область действия переменной Рисовать_ли — весь класс
Form1, т. е. изменить или выяснить ее значение можно в любой процедуре этого класса.

Значение переменной Рисовать_ли может изменить либо событие MouseUp (кнопку мыши отпустили, рисовать нельзя, Рисовать_ли = false), либо событие MouseDown (кнопку мыши нажали, рисовать можно, Рисовать_ли = true). При перемещении мыши с нажатой кнопкой программа создает графический объект Graphics пространства имен System.Drawing, используя метод CreateGraphics(), и рисует прямоугольник FillRectangle(), заполненный красным цветом, размером
10x10 пикселов, е.Х, e.Y — координаты указателя мыши, которые так же являются координатами левого верхнего угла прямоугольника.

На рис. 5.4 приведен пример рисования в форме. Чтобы стереть все нарисованное в форме, следует нажать кнопку Стереть. При этом вызывается метод Refresh(), предназначенный для перерисовывания формы. Здесь в комментарии приведены варианты реализации очистки формы от всего нарисованного на ней пользователем. Например, путем создания графического объекта СreateGraphics() и закрашивания формы в ее первоначальный цвет KnownСolor.Control.



Рис. 5.4. Рисование мышью в форме

Заметим, что можно было бы очистить область рисования более короткой командой Clear (Color, White), т.е. закрасить форму белым цветом (White), либо выбрать другой цвет из списка 146 цветов после ввода точки за словом Сolor. Однако ни один из 146 цветов не является первоначальным цветом формы (BackColor). Поэтому задаем этот цвет через другие константы цвета, представленные перечислении Color.FromKnownColor. Также можно задать цвет как Color.FromName("Control"). Можно использовать функцию перевода шестнадцатеричного кода цвета ColorTranslator.FromHtml(). Оба эти варианта представлены в комментарии. Цвет #efebde является шестнадцатеричным представлением нужного нам цвета.

Очистить форму от всего нарисованного на ней можно также, свернув ее, а затем восстановив. Рисовать в форме можно как левой, так и правой кнопками мыши.

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

РисМышью.sln в папке РисМышью.

Пример 33. Рисование в форме графических примитивов (фигур)

В векторных чертежах графическим примитивом называют элементарные со­ставляющие чертежа: отрезок, дуга, символ, окружность и др. Здесь мы имеем дело с растровой графикой, но в данном случае подход тот же — по координатам рису­ем те же фигуры. Система координат такая: начало координат — это левый верх­ний угол формы, ось Охнаправлена вправо, а Оу— вниз.

Наша задача состоит в том, чтобы рисовать в форме окружность, отрезок, пря­моугольник, сектор, текст, эллипс и закрашенный сектор. Выбор того или иного графического примитива осуществить через элемент управления ListBox (Список). Причем при рисовании очередного графического примитива нужно "стереть" пре­дыдущий рисунок.

Для решения этой задачи создадим форму и перетащим в нее из окна Toolbox элемент управления ListBox. Далее — двойной щелчок в пределах формы, где сра­зу после выполнения процедуры InitializeComponent создадим список графиче­ских примитивов, заполняя коллекцию (items) элементов списка listBox1 (лис­тинг 5.6).

Листинг 5.6. Рисование на форме графических примитивов

//Программа позволяет рисовать в форме графические примитивы:

//окружность, отрезок, прямоугольник, сектор, текст, эллипс и закрашенный сектор.

//Выбор того или иного графического примитива осуществляется с помощью элемента управления ListBox

using System;

using System.Drawing;

using System.Windows.Forms;

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

namespace РисФигур

{

public partial class Form1 : Form

{

public Form1()

{

InitializeComponent();

this.Text = "Выбери графический примитив";

listBox1.Items.AddRange(new Object[] {"Окружность", "Отрезок",

"Прямоугольник", "Сектор", "Текст", "Эллипс", "Закрашенный сектор"});

Font = new Font("Times New Roman", 14);

}

private void listBox1_SelectedIndexChanged(object sender, EventArgs

{ // Здесь вместо этого события можно было бы обработать

// событие listBoxl.Click.

// Создание графического объекта

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

// Создание пера для рисования им фигур

Реп Перо = new Pen(Color.Red);

// Создание кисти для "закрашивания" фигур

Brush Кисть = new SolidBrush(Color.Red);

// Очистка области рисования путем ее окрашивания

// в первоначальный цвет формы

Графика.Clear(SystemColors.Control);

// или Графика.Clear(Color.FromName(Control"));

// или Графика.Clear(ColorTranslator.FromHtml("#EFEBDE"))

switch (listBox1.Selectedlndex) // Выбор фигуры:

{

case 0: // - выбрана окружность:

Графика.DrawEllipse(Перо, 50, 50, 150, 150); break;


case 1: // - выбран отрезок:

Графика.DrawLine(Перо, 50, 50, 200, 200); break;

case 2: // - выбран прямоугольник:

Графика.DrawRectangle(nepo, 50, 30, 150, 180); break;

case 3: // - выбран сектор:

Графика.DrawPie(Перо, 40, 50, 200, 200, 180, 225); break;

case 4: // - выбран текст:

string s = "Каждый во что-то верит, но\п" + "жизнь преподносит сюрпризы.";

Графика.Drawstring(s, Font, Кисть, 10, 100); break;

case 5: // - выбран эллипс:

Графика.DrawEllipse(Перо, 30, 30, 150, 200); break;

case 6: // - выбран закрашеный сектор:

Графика.FillPie(Кисть, 20, 50, 150, 150, 0, 45); break;

}

}

}

)

В программе, обрабатывая событие изменения выбранного индекса в списке listBox1 (хотя с таким же успехом в этой ситуации можно обрабатывать щелчок на выбранном элементе списка), создаем графический объект графика, перо для рисования им фигур и кисть для "закрашивания" ею фигур. Далее очищаем об­ласть рисования путем окрашивания формы в первоначальный цвет "Control" или "#efebde" (как записано в комментарии), используя метод Clear() объекта Графика:

Графика.Clear(SystemColors.Control);

При очищении области рисования оставляем цвет формы первоначальным — “Control". Кстати, этот цвет можно назвать цветом Microsoft: это цвет Windows Explorer, Internet Explorer и проч.

После очистки формы, используя свойство SelectIndex, которое указывает на номер выбранного пользователем элемента списка (от 0 до 6), рисуем выбранную фигуру. На рис. 5.5 представлен фрагмент работы программы.



Рис. 5.5. Рисование графического примитива на форме

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

Пример 34. Выбор цвета с использованием ListBox

В этом примере мы ставим задачу написать программу, которая меняет цвет фона формы BackColor, перебирая константы цвета, предусмотренные в Studio 2010, с помощью элемента управления ListBox.

Для решения данной задачи запустим Visual Studio 2010, выберем проект шаблона Windows Forms Application С#. На вкладке дизайнера формы из панели элементов Toolbox перетащим на форму список элементов ListBox. На вкладке программного кода Forml.cs введем текст, представленный в листинге 5.7.

Листинг 5.7. Выбор цвета с помощью элемента управления ListBox(вариант 1)

// Программа меняет цвет фона формы BackColor, перебирая константы цвета,

// предусмотренные в Visual Studio 2010, с помощью элемента управления ListBox


using System;

using System.Drawing;

using System.Windows.Forms;

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

namespace ВыборЦвета1

{

public partial class Form1 : Form

{

public Form1()

{

InitializeComponent();

// Получаем массив строк имен цветов из перечисления KnownColor

string[] ВсеЦвета = Enum.GetNames(typeof(KnownColor));

listBox1.Items.Clear();

// Добавляем имена всех цветов в список listBox1:

listBox1.Items.AddRange(ВсеЦвета);

// Сортировать записи в алфавитном порядке

listBox1.Sorted = true;

}

private void listBox1_SelectedIndexChanged(object sender, EventArgs e)

{ // Цвет Transparent является "прозрачным", он не поддерживается для формы:

if (listBox1.Text == "Transparent") return;

this.BackColor = Color.FromName(listBox1.Text);

this.Text = "Цвет: " + listBox1.Text;

}

}

}

Как видно из программного кода, сразу после вызова InitializeComponent, используя метод Enum.GetNames, получим массив имен цветов в строковом представлении. Теперь этот массив очень легко добавить в список (коллекцию) ListBox методом AddRange. Если вы еще не написали обработку события изменения выбранного индекса, попробуйте уже на данном этапе запустить текущий проект (клавиша <F5>). Вы увидите форму и заполненные строки элемента управления ListBox цветами из перечисления KnownColor. Обрабатывая событие изменения убранного индекса в списке ListBox, предпоследней строкой назначаем выбранный пользователем цвет формы (BackColor). Один из цветов перечисления KnownColor — цвет Control ("умалчиваемый" цвет формы), который является базовым цветом во многих программах Microsoft, в том числе Windows Explorer, Internet Explorer. Visual Studio 2010 и проч. Кроме того, здесь цветов больше, чем в константах цветов (структуре) Сolor (в структуре Сolor нет цвета Сontrol). Один из цветов — Transparent — является "прозрачным", и для фона формы он не под­держивается. Поэтому если пользователь выберет этот цвет, то произойдет выход из процедуры (return), и цвет формы не изменится.

На рис. 5.6 приведен пример работы программы. Как видно, пользователь вы­брал цвет Control, который соответствует цвету формы по умолчанию.



Рис. 5.6. Закраска формы выбранным цветом

Эту программу можно написать более элегантно с использованием цикла fоreach при заполнении списка формы именами всех цветов (листинг 5.8).

Листинг 5.8. Выбор цвета с помощью элемента управления ListBox(вариант 2)

using System;