Жанр: Учеба
Си шарп: создание приложений для windows
...писок изображений те четыре пиктограммы,
которые создали в предыдущем разделе.
Добавьте на форму компонент ToolBar. На форме появится пустая панель
инструментов (рис. 26.7).
Свойство ImageList добавленного объекта toolBarl измените на imageListl.
Таким образом, вы свяжете созданный список изображений с панелью
290 Раздел I I I . Программирование для Windows
инструментов. Добавим к панели инструментов
необходимые кнопки. Для этого в окне
свойств объекта toolBarl необходимо настроить
свойство Buttons. Нажмите на кнопку с
тремя точками в поле Buttons. Откроется окно
ToolBarButton Collection Editor. Добавьте четыре
кнопки и назовите их toolBarButtonPen,
toolBarButtonFill, tool BarButton Line, ToolBarButtonEllipse,
изменив свойство Name каждого элемента в
правом окне редактора. Свойство Style каждой
кнопки установите в ToggleButton. Это
позволит кнопкам удерживаться в нажатом
состоянии. Нам необходимо это свойство,
потому как нажатая кнопка будет характеризовать
текущий режим работы редактора.
Последним шагом в настройке кнопок панели инструментов является установка
изображений для каждой конкретной кнопки. Какое именно изображение
из списка будет соответствовать кнопке, задается свойством
Imagelndex. Выберите для каждой кнопки изображение, соответствующее
ее индексу:
0 - toolBarButtonPen - Карандаш
1 - toolBarButtonText - Текст
2 - toolBarButtonLine - Линия
3 - ToolBarButtonEllipse - Эллипс
В итоге у вас получится панель инструменту]
т} \ | о[ тов, соответствующая рис. 26.8.
Вы уже можете запустить программу и посмотреть
результаты своей работы. Программа
будет содержать только панель инструментов,
которая не выполняет пока никаких функций.
Добавьте в программу перечисление (enum), которое будет содержать
режимы работы программы (инструменты). Для этого выше описания
класса Forml добавьте описание перечисления.
namespace GraphEditorApp
public enum Tools
PEN - 1, TEXT, LINE, ELLIPSE, NONE - 0
/// "summary"
/// Summary description for Forml.
/// "/summary"
public class Forml: System.Windows.Forms.Form
Панель инструментов - TooIBar 291
В классе Forml создайте объект перечисления.
public class Forml: System.Windows.Forms.Form
i
public Tools currentTool;
Этот объект будет содержать выбранный в панели инструментов инструмент
для рисования. Впоследствии программа будет использовать эту
переменную для определения того, какой инструмент выбран текущим.
Для того чтобы завершить работу с панелью инструментов приложения,
добавьте обработчик события ButtonClick объекта toolBarl, щелкнув
два раза указателем мыши по имени события ButtonClick на закладке
событий в окне свойств. При этом в программу добавится функция
toolBarl_ButtonClick как обработчик события, происходящего при нажатии
кнопки на панели инструментов. У вас может возникнуть вопрос: "Как
мы узнаем о том, какая именно кнопка была нажата?" Да, действительно,
мы не создаем отдельный обработчик для каждой кнопки панели
управления. Но мы можем различить это по параметрам, передаваемым
в функцию. Измените метод toolBarl_ButtonClick и добавьте дополнительный
код, как показано ниже:
private void toolBarl_ButtonClick(object sender,
System.Windows.Forms.ToolBarButtonClickEventArgs e)
{
switch•e.Buncon.ImageIndex)
{
case 0:
// установка режима рисования карандашом
currentTool = Tools.PEN;
break;
case 1:
// установка режима текста
currentTool = Tools.TEXT;
break;
case 2:
// установка режима рисования линий
currentTool - Tools.LINE;
break;
case 3:
// установка режима рисования эллипсов
CurrentTooi. = Tools.ELLIPSE;
break;
SetToolBarBuctonsPushedState(e.Button);
1
private void SetToolBarButtonsPushedState(ToolBarButton button)
292 Раздел I I I . Программирование для Windows
foreach(TooIBarButton btnlten in tooiBarl.Buttons)
if(btnltem =- button)
{
btnltem.Pushed = true;
}
else
{
btnltem.Pushed = false;
Обработчик нажатия кнопок на панели инструментов - функция toolBarl_ButtonClick
- включает в себя инструкцию switch, которая позволяет
определить, какая именно кнопка была нажата. Вторым параметром
функции-обработчика является переменная типа ToolBarButtonClickEventArgs.
Класс ToolBarButtonClickEventArgs имеет свойство Button, которое соответствует
нажатой кнопке. Если свойство Imagelnclex кнопки совпадает с искомым
индексом в инструкции case, то будет выполняться соответствующая
операция. В соответствии с нажатой кнопкой выставляется режим
работы программы (текущий выбранный инструмент).
Функция SetToolBarButtonsPushedState предназначена для контроля состояния
кнопок панели инструментов. Если вы запускали программу до
изменения вышеприведенного кода, то при нажатии кнопок на панели
инструментов они нажимались независимо друг от друга. Но для нашего
приложения свойственно существование только одного режима в один
момент времени. Поэтому может быть нажатой только одна из кнопок.
Функция SetToolBarButtonsPushedState следит за состоянием нажатия
кнопок. При помощи цикла foreach функция просматривает все кнопки
панели инструментов. Та из кнопок, которая совпадает с переданным
параметром, делается вдавленной, свойство Pushed устанавливается в true.
Для всех остальных кнопок свойство Pushed устанавливается в false.
Вызов функции SetToolBarButtonsPushedState происходит из обработчика
нажатия кнопок toolBarl_ButtonClick с параметром, соответствующим нажатой
кнопке. Поэтому нажатая кнопка будет вдавлена, а все остальные нет.
Теперь при запуске программы вы увидите, что только одна из кнопок
может быть вдавлена в один момент времени. Как только вы нажмете
Другую кнопку, предыдущая вдавленная примет свое обычное состояние.
На этом мы завершим разработку панели инструментов приложения,
но не закончим разработку самого приложения. Нам еще много предстоит
сделать, чтобы созданная нами панель инструментов выполняла назначенные
ей функции. Сохраните приложение GraphEditorApp, используя
пункт меню SaveAll.
27. СОЗДАНИЕ MDI ПРИЛОЖЕНИИ
MDI (Multiple-document interface) приложения позволяют отображать
сразу несколько документов одновременно. При этом каждый документ
будет отображаться в своем собственном окне. Обычно MDI приложения
имеют в основном меню подпункты для переключения между окнами и
документами.
РОДИТЕЛЬСКИЕ И ДОЧЕРНИЕ ФОРМЫ
Механизм работы MDI приложений немного сложнее, чем обычных
Windows Forms приложений, базирующихся на диалогах. Основным окном
MDI приложения является родительская форма. Она может содержать
несколько дочерних окон. Только одно из дочерних окон может быть
активно в один момент времени.
Создание родительской формы
Мы не будем создавать новое приложение. Откройте проект программы
GraphEditorApp, который был создан при изучении предыдущей
главы.
Свойство IsMdiContainer установите в true, это будет определять форму
как родительское окно MDI приложения.
Создание головного меню
Создайте основное меню программы (глава 25). Добавьте в меню пункты
"&Файл", "&Инструмент" и "&Окно". Измените их свойство name на
menuItemFile, menuItemTool и menuItemWindow соответственно.
Добавьте в меню "&Файл" пункт "&Создать". Свойство name установите
в menuItemNew. Этот пункт меню будет предназначен для создания
дочерних окон.
В меню "&Инструмент" добавьте пункты "&Карандаш", "&Текст",
"&Линия", "&Эллипс". Свойство name для них установите как:
"&Карандаш" - menuItemPen;
"&Текст" - menuItemText;
"&Линия" - menuItemLine;
"&Эллипс" - menuItemEIIipse.
Эти пункты меню будут предназначены для выбора режима работы
программы, точно так же, как это делается из панели инструментов.
294 Раздел III.
Пункт меню "&Окно" будет содержать список всех открытых дочерних
окон. Такая возможность заложена в меню автоматически. Вам необходимо
лишь выставить для пункта меню свойство MdiList в true. Установите
свойство MdiList пункта меню "&Окно" в true.
Создание обработчиков меню
Создайте один общий обработчик для подпунктов
меню пункта "&Инструмент". Для
этого выделите все четыре пункта меню, удерживая
клавишу Ctrl, и щелкните два раза указателем
мыши по событию Click в окне свойств.
Замените имя события, созданное по умолчанию,
на имя menuItemTool_Click. Для этого просто
измените строку в поле, соответствующем
имени события, в окне свойств (рис. 27.1).
Как вы уже, наверное, догадались, функция
menuItemTool_Click будет выполнять ту же
задачу, что и функция toolBarl_ButtonClick нашего
приложения, то есть устанавливать
инструмент для рисования при выборе определенного
пункта меню. Кроме того, не стоит
забывать о том, что выбранный инструмент
должен быть помечен в меню. Поэтому
мы также должны создать аналог функции
SetToolBarButtonsPushedState для элементов меню. Найдите в коде программы
функцию menuItemTool_Click и измените ее код так, как продемонстрировано
ниже.
private void menuItemTool Click(object sender, System.EventArgs e)
{
// получаем пункт меню
Menultem item = (Menultem)sender;
switch(item.Text)
Рис. 27.1, Изменение имени
обработчика события
case "БКарандаш":
// установка режима рисования карандашом
currentTool =- Tools.PEN;
break;
case "&Текст":
// установка режима заливки
currentTool - Tools.FILL;
break;
case "&Ликия":
// установка режима рисования линий
currentTool = Tools.LINE;
break;
Создание MDI приложений 295
case "&Эллипс":
// установка режима рисования эллипсов
currentTool -•• Tools.ELLIPSE;
break;
// устанавливаем состояние пунктов меню
SetMenuItemsCheckedState (item) ;
// устанавливаем состояние кнопок
SetTociBarButtonsPushedStare(toolBarl.Buttons[item.Index])
private void SetMenuItemsCheckedState (Menul';em i^en)
{
// для каждого пункта меню
foreach(MenuItem menuItem in menui-emTool.Kenu^emsl
i
if(menulten == item)
f
n\e nuItem. Checked - true;
else
m^nultem.Checked = false;
Кроме изменения кода обработчика, я добавил код функции для пометки
пунктов меню. Функция SetMenuItemsCheckedState устанавливает
флажок возле нужного пункта меню. Она принимает в качестве параметра
пункт меню, который послал сообщение. Используя инструкцию
foreach, перебираются все подпункты меню "Инструмент". Если подпункт
совпадает с переданным параметром, то свойство Checked устанавливается
в true, если не совпадает, то свойство Checked устанавливается в
false.
Для того чтобы кнопки на панели инструментов и пункты меню работали
синхронно, необходимо дописать еще несколько строк кода. Как вы
заметили, функция menuItemTooLCIick вызывает метод для установки состояния
кнопок:
SetToolBarButtonsPushedState ftoolBarl.Buttons[item.Indexl);
Таким образом, при выборе пункта меню соответствующая кнопка в
панели инструментов перейдет в нажатое состояние. То же самое нужно
сделать при обработке нажатия кнопок панели инструментов. Необходимо
(кроме вызова функции SetToolBarButtonsPushedState, что уже сделано)
вызвать функцию SetMenuItemsCheckedState. Добавьте вызов метода
296 Раздел I I I . Программирование для Windows
SetMenuItemsCheckedState после вызова SetToolBarButtonsPushedState в функции
toolBarl_ButtonClick.
SetToolBarButtonsPushedState(e.Button);
SetMenuItemsCheckedState (menuItemTool .Menu I terns fe .Button. Image Index;1 ] ;
Запустите программу. Теперь вы можете
71'.".- • выбирать инструмент как из панели инструментов,
так и из меню. При этом выбранный
инструмент будет помечен и в меню, и в
панели инструментов (рис. 27.2).
Рис. 27.2. Меню выбора инструмента
Создание дочерних окон
Шаблон дочернего окна
Любое окно, существующее в приложении, может быть дочерним. Разработчик
сам создает шаблон формы, которая будет являться дочерним
окном. Для того чтобы создать шаблон дочернего окна, добавьте в приложение
новую форму. Для этого выберите из меню пункт Project/Add
Windows Form .... Пометьте в правом списке пункт Windows Form и нажмите
кнопку Open. Перед вами откроется окно дизайнера форм и новая
форма с именем Form2. Измените некоторые свойства Form2:
Text -Новое окно
BackCoIor - Window.
Обработка событий
Создание дочерних окон должно происходить при выборе пункта меню
"Создать". Для этого нам необходимо создать обработчик этого пункта
меню. Щелкните два раза указателем мыши по имени события Click пункта
меню "Создать" в окне свойств. В код программы добавится обработчик
события Click с именем menuItemNew__Click. Добавьте к обработчику
события menuItemNew_Click представленный ниже код:
private void menultemKew_Click(object sender, System.EventArgs e)
b'orm2 newMDIChild = new Forrr,2(l;
newMDIChild.MdiParent = this;
newMDIChild.Show(J;
В функции создается экземпляр класса Form2 с именем newMDIChild.
Объект newMDIChild -это обычное окно. Для того чтобы создаваемое окно
отображалось как дочерняя форма приложения, необходимо установить его
свойство MdiParent равным this. Таким образом, мы укажем, что родительской
Создание MDI приложений 297
•- ч п п •г.-
гтя
РИС. 27.3.
окон
Список открытых дочерних
формой создаваемого окна является главная
форма приложения. Все, что остается
сделать, это отобразить форму на экране.
Для этого используется метод Show.
Запустите программу. Выберите из
меню пункт Файл/Создать. На экране
появится дочернее окно с именем "Новое
окно". Вы можете создать еще несколько
дочерних окон, воспользовавшись
все тем же пунктом меню. При
этом пункт меню Окно будет содержать
список всех дочерних окон, открытых на
текущий момент (рис. 27.3).
Сохраните приложение GraphEditor.
Оно еще пригодится в обсуждении следующих
глав.
28. ОБРАБОТКА СООБЩЕНИИ МЫШИ
Мышь стала неотъемлемым атрибутом при работе в Windows. Поэтому
в любой программе вы должны предоставлять пользователю возможность
выполнить любое действие при помощи мыши. Исключение составляет
ввод символов с клавиатуры.
ВИДЫ СОБЫТИИ
Для обработки сообщений мыши в С# предусмотрен ряд событий,
которые посылаются программе при совершении определенных действий.
События посылаются, если вы передвинете курсор мыши, щелкните какой-нибудь
кнопкой либо проделаете все эти действия одновременно.
Для обработки сообщений от мыши у формы
существуют следующие события (рис. 28.1):
MouseDown - обработка нажатия какой-либо из кнопок
вниз;
MouseEnter - вызывается при попадании указателя
мыши в область формы;
MouseHover - вызывается при зависании указателя
мыши в окне формы;
MouseLeave - вызывается при покидании курсора
мыши области формы;
MouseMove - вызывается при движении мыши в области
формы;
MouseUp - вызывается при отпускании кнопки мыши.
Для примера программы обработки сообщений мыши будем использовать
приложение GraphEditorApp. Откройте проект GraphEditorApp, с
которым мы работали в предыдущей главе. Откройте в окне дизайнера
форму Form 2.
ПАРАМЕТРЫ СОБЫТИИ
Создайте для формы Form2 обработчик события MouseDown. Для этого
щелкните два раза указателем мыши по событию MouseDown в окне свойств.
В коде программы появится функция-обработчик Form2_MouseDown. Реализуйте
ее так, как показано в нижеприведенном коде:
private void Form2 MouseDown(object sender,
System.Windows.Forms.MouseEventArgs e)
j Form2
S i
Resi
В 's
"item ^'inj-w, Fi
Mouse C'.wn
Мои
M.u
Мэи
Muu
S'' ч
РИС.
cEnte"
ehover
eteave
^Mr,e
pip
28.1. Mouse
ms Fjim
-
events
-i
Zl
string text;
MouseButtons button;
button = e.Button;
if (button == MouseButtons.Left)
(
text = "левую";
}
else if(button == MouseButtons.Right)
i
text = "правую";
else
{
text = "среднюю";
}
str_ng message = "Вы нажали " + text + " кнопку мыши в координатах:\n"+
"х:= " + e.X.ToString() + "\п" +
"у:- " I- e.Y.ToString () ;
MessageBox.Show(message);
}
Параметр функции MouseEventArgs содержит всю информацию о кнопке,
пославшей сообщение. Свойство MouseEventArgs.Button хранит информацию
о типе кнопки (левая, правая, средняя). Блок инструкций if ... else
выбирает из трех возможных вариантов ту кнопку, которая передалась в
качестве параметра. На основании полученной информации о кнопке формируется
текст сообщения. Например, если вы нажмете левую кнопку
мыши, то сообщение будет содержать строку "Вы нажали левую кнопку
мыши". В конец строки сообщения дописываются координаты окна, в
которых был совершен щелчок указателем мыши.
Запустите программу. Создайте новое окно,
используя меню Файл/Создать. Щелкните курсором
в любом месте дочернего окна. На экране
появится сообщение, аналогичное тому, которое
изображено на рис. 28.2.
Точно так же можно обрабатывать другие
Рис 28 2 сообщение сообщения от мыши. Теперь сохраните прилоо
нажатии левой кнопки жение GraphEditorApp. Этот пример еще пригомыши
дится в следующей главе.
Еь. Hia^ii'- r?byw кипп"* --ьии & кго *:" 164
у." 131
29. РАБОТА С ГРАФИКОЙ
ОСОБЕННОСТИ GDI+
Для рисования объектов в Windows Forms приложениях язык С#
содержит очень богатый набор методов. Пространство имен Drawing содержит
множество объектов, которые облегчают программисту работу
с графикой. Специально для .NET платформы разработчики Microsoft
разработали GDI+ библиотеку, значительно повысив возможности GDI
(Graphic Device Interface). GDI+ включает возможности рисования простейших
объектов (линии, эллипсы...), рисование различных объектов
2D графики, отображение файлов различных графических форматов
(bmp, jpeg, gif, wmf, ico, tiff...) и многое другое. Мы рассмотрим работу
с простейшими объектами для рисования: линиями, окружностями,
шрифтами.
РИСОВАНИЕ ОБЪЕКТОВ
Откройте приложение GraphEditorApp, с которым мы работали в предыдущих
создание дочерних окон, обработка сообщений от мыши. Теперь мы узнаем
о том, как рисовать графические примитивы. Для начала следует
уточнить функциональность программы.
Для рисования линии вам необходимо будет два раза щелкнуть мышью
в различных частях окна. При этом линия нарисуется от координаты,
в которой произошел первый щелчок мышью в координату, где произошел
второй щелчок мышью. Это нетипично для графического редактора.
Обычно линия тянется от координаты первого щелчка мыши за
курсором до тех пор, пока пользователь не отпустит кнопку. Но такая
функциональность потребует усложнить код программы. Для наших учебных
целей мы обойдемся двумя щелчками указателя мыши.
Рисование эллипсов аналогично рисованию линий. Первый щелчок
мыши будет задавать левую верхнюю координату эллипса, а второй -
правую нижнюю координату.
Рисование текста. При щелчке мыши строка текста будет отображаться
справа от курсора.
Особый интерес представляет рисование карандашом. Оно должно
происходить во время движения указателя мыши по области окна с нажатой
левой кнопкой мыши. Для отображения пути движения указателя
мыши мы будем рисовать линии между предпоследней координатой
Работа с графикой 301
курсора и последней. Для этого нам придется постоянно запоминать координату
последнего положения курсора мыши.
Ну что же, теоретическая часть на этом завершена, приступим к
примеру.
Рисование карандашом
Откройте из окна SolutionExplorer форму Form2. Эта форма описывает
дочернее окно нашего приложения. Именно в классе Form2 нам необходимо
написать код, который позволит рисовать графические примитивы.
У нас в программе уже присутствует обработчик события MouseDown.
Вам необходимо добавить обработчики для событий MouseMove и MouseUp.
Сделайте это, щелкнув два раза по соответствующим полям на закладке
событий в окне свойств. Тот код, который у вас присутствовал в обработчике
события MouseDown, нам больше не понадобится. Вы можете
удалить его либо закомментировать.
Измените код обработчиков событий так, как представлено ниже:
private void 7orm2_MouseDown(object sender,
Systesr .Windows . Forms .MouseEventArgs e)
{
Forml parencForm =• (Forml)KdiParent;
switch(parentForm.currentTool)
{
case Tools.LINE:
//DrawLine(new Point (e.X, e.Y));
break;
case Tools.ELLIPSE:
//DrawEllipse(new Point (e.X, e.Y));
break;
case Tools.TEXT:
//DrawText(new Pointfe.X, e.Y));
break;
case Tools.РЕК:
// устанавливаем флаг для начала рисования карандашом
drawPen = true;
break;
// запоминаем первую точку для рисования
PreviousPoint.X = e.X;
PreviousPoint.Y = e.Y;
private void Form2_MouseUp(object sender,
System.Windows.Forms.MouseEventftrgs e}
302 Раздел I I I . Программирование для Windows
drawPen = false;
private void Form2 MouseMove(object sender,
System.Windows.Forms.MouseEventArgs e)
{
// если курсов еще не отпущен
if(drawPen)
{
// создаем объект Pen
Pen blackPen = new Pen (Color.Black, 3);
// получаем текущее положение курсора
Point point = new Pointfe.X, e.Y);
// создаем объект Graphics
Graphics g = this.CreateGraphics();
// рисуем линию
g.DrawLine(blackPen, PreviousPoint, point]
// сохраняем текущую позицию курсора
PreviousPoint = point;
Когда вы введете этот код, программа не будет компилироваться.
Дело в том, что я добавил в класс Form2 новые поля и методы. Вы
должны были это заметить. В коде программы используются необъявленные
пока переменные PreviousPoint, drawPen и необъявленные методы
DrawLine, DrawEllipse и Text. Последние закомментированы и не мешают
пока компиляции программы. А вот переменные необходимо
объявить. Давайте объявим в программе переменные PreviousPoint и
drawPen:
public class Form2: System.Windows.Forms.Form
!
public bool drawPen;
public Point PreviousPoint;
Переменные следует объявить членами класса Form2. drawPen - это
двоичная переменная, которая будет определять, рисовать карандашу
или нет. Обработчик Form2_MouseDown выставляет значение переменной
drawPen в true, если в момент нажатия кнопки мыши установлен инструмент
"Карандаш". Обработчик Form2_MouseUp выставляет значение переменной
назад в false. Таким образом, при нажатии кнопки мыши флаг
drawPen устанавливается в true и не сбрасывается в false до тех пор, пока
пользователь не отпустит кнопку вверх. Обработчик Form2_MouseMove
Работа с графикой 303
рисует на экране линии только тогда, когда переменная drawPen находится
в true. Рисование происходит следующим образом:
1. Создается объект Реп, который инициализируется черным цветом
(Color.Black) и толщиной линии, равной 3.
Реп ЫаскРеп = new Pen (Color. Black, 3);
2. Получаются текущие координаты курсора мыши.
P o i n t p o i n t = new P o i n t ( e . X , e . Y ) ;
3. Создается объект Graphics на базе текущей формы.
Graphics g = this.CreateGraphics(I;
4. Вызывается метод DrawLine объекта Graphics. В качестве координат
линии передаются предыдущая и текущая координаты курсора мыши.
После прорисовки линии текущая координата курсора мыши запоминается
в переменную, которая хранит предыдущую координату.
PreviousPoint = point;
Таким образом, каждое движение мыши
с нажатой кнопкой будет заставлять
программу рисовать линию между двумя
соседними точками. В итоге получится
кривая пути, по которому двигался
курсор мыши.
Запустите приложение. Создайте новое
окно. Выберите режим рисования карандашом.
Попробуйте нарисовать в окне
любую кривую линию, удерживая курсор
мыши в нажатом состоянии (рис. 29.1).
Если у вас получилось нарисовать кривую-
вы все сделали правильно, если
нет - внимательно перечитайте приведенное
в книге описание. Если и потом у
вас все же что-то не получилось - не расстраивайтесь.
Я понимаю, что приведенный
в этой главе пример довольно громоздкий, поэтому вынес полный
листинг кода программы GraphEditorApp в Приложение. Вы можете набрать
программу заново из приложения либо сравнить мой код со своим
на предмет наличия ошибок.
Однако наша программа еще не завершена. Нам предстоит реализовать
функции рисования линий, эллипсов и написания текста.
Рисование текста и графических примитивов
Для этого добавьте в класс Form2 описание приведенных ниже функций:
void DrawLine(Point point)
Рис. 29.1. Рисование карандашом
// если один раз уже щелкнули
if (FirstClick == true)
304 Раздел I I I . Программирование для Windows
// создаем объект Реп
Реп ЫаскРеп = new Pen (Color .Black, 3) ;
// создаем объект Graphics
Graphics g = this.CreateGraphics();
// рисуем линию
g. DrawLine (ЫаскРеп, Previous Point, point
FirstCIick = false;
FirstCIick = true;
void DrawEllipse(Poin- point]
[
// если один раз уже щелкнули
if (FirstCIick == crue)
j
// создаем объект Pen
Pen ЫаскРеп = new Pen (Color .Black, 3);
// создаем объект Graphics
Graphics g = this.CreateGraphics();
// рисуем эллипс
g. DrawEllipse ( ЫаскРеп,
PreviousPoint.X, PreviousPoint.Y,
point.X- PreviousPoint.X, point.Y - PreviousPoint.Y)
FirstCIick = false;
else
FirstCIick = true;
void DrawText(Point point)
t
// создаем объект Graphics
Graphics g = this.CreateGraphics ();
Работа с графикой 305
// создаем объект Font
Font titieFont = new Font("Lucida Sans Unicode", 15);
// рисуем текст красным цветом
g.DrawString("Программирование на С#",
titleFont, new SolidBrush{Color.Red), point.X, point.Y);
Методы DrawLine и DrawEllipse используют переменную FirstClick. Добавьте
объявление этой переменной в класс Form2.
public bool drawPen;
public bool FirstClick;
public Point PreviousPoint:;
Методы DrawLine и DrawEllipse рисуют объекты по двум координатам точек
на экране. При первом щелчке мыши запоминается первая координата и
выставляется значение переменной FirstClick в true. При втором щелчке
мыши происходит рисование линии, и значение FirstClick сбрасывается в
false.
Для рисования текста используется
метод DrawText. Для прорисовки
сначала создается объект Font со
шрифтом типа Lucida Sans Unicode размером
15 единиц. Затем при помощи
метода DrawString строка текста "Программирование
на С#" выводится на
экран.
Теперь вы можете откомментировать
вызовы методов DrawLine, DrawEllipse
и DrawText в функции Form2_MouseDown.
Запустите программу. Выбирая различные
режимы работы программы,
вы можете создавать простейшие графические
изображения (рис. 29.2).
"1роггмммироканис на. С
Рис. 29.2. Использование приложения
"Графический редактор"
30. РАБОТА С КЛАВИАТУРОЙ
Мы уже рассмотрели в главе 28 обработку сообщений мыши. Однако
как бы не было полезно использование мыши, без клавиатуры не обойтись.
Скажу больше: все коммерческие приложения должны иметь возможность
выполнить любую команду, как при помощи мыши, так и при
помощи кла
...Закладка в соц.сетях