Васильев А.Н. Основы программирования на C#. Васильев А. Н. Программирование
Скачать 5.54 Mb.
|
464// Ɉɫɜɨɛɨɠɞɟɧɢɟ ɪɟɫɭɪɫɨɜ, ɡɚɞɟɣɫɬɜɨɜɚɧɧɵɯ // ɞɥɹ ɪɢɫɨɜɚɧɢɹ: g.Dispose(); p.Dispose(); } } // Ƚɥɚɜɧɵɣ ɤɥɚɫɫ: class CursorDemo{ [STAThread] // Ƚɥɚɜɧɵɣ ɦɟɬɨɞ: static void Main(){ // Ɉɬɨɛɪɚɠɟɧɢɟ ɨɤɧɚ: Application.Run(new MyForm()); В классе окна MyForm есть поле p класса Pen и поле g класса Graphics оба класса из пространства имен System.Drawing). Это ссылки на объекты, которые нам понадобятся при рисовании линий. В конструкторе класса создается метка (объект lbl класса Label) и панель (объект pnl класса Panel). Для них и для объекта окна задаются их размеры и положение, а также ряд других параметров (назначение соответствующих команд должно быть понятно читателю. Для панели командой pnl.BackColor=Color.Yellow задается желтый цвет фона. Команда pnl.Cursor=Cursors.Hand используется для того, чтобы задать вид курсора мыши, когда он находится над областью панели. В данном случае свойству Cursor объекта панели pnl в качестве значения присваивается константа Hand из перечисления Cursors, и поэтому над областью панели курсор будет принимать вид ладони. Поскольку мы собираемся рисовать линии, тонам понадобится два объекта. Первый объект создается на основе класса Pen. Объект создается командой p=new Pen(Color.Blue,3). Он содержит информацию о цвете и толщине линий в процессе рисования. Командой g=pnl.CreateGraphics() в поле g записывается ссылка на объект Для панели определяются обработчики для события MouseMove, связанного с перемещением курсора над областью панели, а также для события, связанного с перемещением курсора за пределы панели. В частности, в список обработчиков события MouseMove объекта панели pnl добавляется ссылка на анонимный метод, определенный лямбда-выражением. В теле метода командой pnl.Refresh() выполняется перерисовка панели. Это необходимо, чтобы стереть линии, нарисованные для предыдущего положения курсора. Командами и lbl. Text+= Ǝȼɟɪɬɢɤɚɥɶ: Ǝ+ea.Y определяется текст метки (команд три, хотя можно было воспользоваться и одной. Здесь использованы выражения и ea.Y, которые возвращают координаты (горизонтальную и вертикальную, соответственно) курсора мыши в области панели ПОДРОБНОСТИ bДелегат EventHandler , которому должны соответствовать методы- обработчики для событий графических компонентов, подразумевает наличие у метода второго аргумента (объявлен как переменная класса EventArgs ), содержащего информацию о событии. В данном случае второй аргумент обозначен как ea . Его свойства X и Y позволяют определить координаты курсора мыши в момент события. Для отображения линий использованы команды g.DrawLine(p,new Point(0,ea.Y),new и g.DrawLine(p,new Point(ea.X,0),new Point(ea.X,pnl. ClientSize.Height)) . В обоих случаях из объекта графического контекста вызывается метод DrawLine(), предназначенный для отображения линии. Первым аргументом методу передается объект p класса Pen , который определяет цвет и толщину линии. Два других аргумента метода — объекты класса Point, определяющие начальную и конечную точки, которые соединяет линия ПОДРОБНОСТИ bВыражения pnl.ClientSize.Width и pnl.ClientSize.Height определяют, соответственно, ширину и высоту клиентской (внутренней, доступной для использования) области панели Приложения с графическим интерфейсом 467 В случаях, когда курсор выходит за пределы области панели, обработка выполняется так командой lbl.Text= ƎƎ выполняется очистка содержимого метки, а командой pnl.Refresh() выполняется перерисовка панели НАЗ А МЕТКУ В классе MyForm определен еще и деструктор. В деструкторе выполняются команды g.Dispose() и p.Dispose() , которыми освобождаются ресурсы, задействованные для рисования. Правда в данном случае особого смысла в этих командах нет — при удалении объекта окна из памяти эти ресурсы итак освободятся. Главная причина, по которой описан деструктор, — подчеркнуть, что с ресурсами следует обращаться экономно. Для отображения окна в главном методе используется команда Application.Run(new MyForm()) Резюме Были демоны — мы этого не отрицаем. Но они самоликвидировались. из к/ф Иван Васильевич меняет профессию Для реализации окна формы и прочих графических компонентов существуют специальные классы. Создание графического компонента отождествляется с созданием объекта соответствующего класса Объекты классов для графических компонентов имеют специальные методы и свойства, позволяющие задавать основные характеристики компонентов (размеры, положение, шрифт, цвет фона и многое другое Для обработки действий с графическими компонентами в классах компонентов предусмотрены события Характеристики методов, используемых для обработки событий, определяются делегатом EventHandler . Делегат подразумевает, что соответствующий метод не возвращает результат и у него два аргумента ссылка типа object на объект компонента, вызвавшего событие, и объектная ссылка типа EventArgs на объект, содержащий описание события Глава Задания для самостоятельной работы Сеня, по-быстрому объясни товарищу, почему Володька сбрил усы. из к/ф Бриллиантовая рука Напишите программу, отображающую окно, в котором внутренняя часть закрашена желтым цветом. При наведении курсора на область окна цвет фона меняется на зеленый. При щелчке мышью размеры окна должны увеличиваться на 10%. 2. Напишите программу, в которой отображается окно с текстовой меткой и тремя кнопками. В текстовой метке содержится число (начальное значение — нулевое. Щелчок по одной из меток приводит к увеличению значения числа на единицу. Щелчок подругой кнопке приводит к уменьшению значения числа на единицу. Щелчок по третьей кнопке приводит к закрытию окна Напишите программу, в которой открывается окно с раскрывающимся списком. Список содержит названия цветов (красный, желтый, зеленый итак далее. Также окно содержит область, закрашенную тем цветом, который выбран в списке. При выборе в списке нового цвета область закрашивается этим цветом автоматически Напишите программу, в которой открывается окно с полем ввода. При вводе текста в окно этот текст автоматически дублируется в текстовой метке. В окне должны быть две опции, которые позволяют применять к тексту в метке жирный и курсивный стили Напишите программу, в которой отображается окно с двумя текстовыми полями. Предполагается, что в эти текстовые поля вводятся целочисленные значения. Кроме полей, в окне размещена метка, в которой содержится информация о том, какое из двух чисел больше/меньше или что числа равны друг другу. Информация в метке обновляется автоматически при изменении содержимого полей. Если хотя бы водном из полей указано не число, метка должна содержать информацию об этом Напишите программу, в которой отображается окно с изображением и двумя кнопками. Имеется несколько изображений, которые последовательно циклически отображаются в окне при щелчке по кнопкам. При щелчке по одной кнопке появляется следующее изображение Приложения с графическим интерфейсом в последовательности, а при щелчке подругой кнопке отображается предыдущее изображение в последовательности Напишите программу, в которой отображается окно со списком выбора. В списке выбора представлены названия шрифтов. Также окно содержит раскрывающийся список с названиями цветов (красный, зеленый, синий итак далее. Окно содержит область с текстом. При выборе цвета или названия шрифта этот цвет или шрифт применяются для отображения текста Напишите программу, в которой отображается окно с закрашенной областью. Для этой области есть контекстное меню с названиями цветов красный, желтый, зеленый итак далее. При выборе команды из контекстного меню область закрашивается соответствующим цветом Напишите программу, в которой отображается окно с главным меню и областью с текстом. Текст содержит информацию о названии, стиле и размере шрифта, которым отображается текст. Вменю есть пункты для выбора названия шрифта, стиля шрифта и размера шрифта. При выборе команды изменю соответствующая характеристика применяется для отображения текста, а также с учетом новых параметров шрифта меняется сам текст Напишите программу, в которой отображается окно, представляющее собой арифметический калькулятор Глава НЕМНОГО О РАЗНОМ Однако не следует думать, что здесь какое-то колдовство или чудо. из к/ф Собачье сердце» В этой главе рассматриваются вопросы, которые по различным причинам не вошли в предыдущие главы (первой и второй части книги, но которые, тем не менее, важны для понимания принципов программирования на C#. Большинство из представленных далее тем рассматриваются в факультативном режиме. Они не связаны между собой концептуально. Главная цель, которую мы преследуем здесь — дать читателю общее представление о томили ином механизме или подходе. Далее мы кратко рассмотрим такие вопросы работа с диалоговыми окнами использование пространств имен работа с датой и временем операции с файлами использование коллекций. Разумеется, приведенные далее теоретические сведения подкрепляются примерами. Работа с диалоговым окном Это не ты говоришь, это кричит твой вакуум! из к/ф Покровские ворота» В самом начале книги (впервой части) мы рассматривали способы вывода сообщений в диалоговое окно. Для этого использовался метод Show() класса MessageBox. На самом деле, окно, которое отображается в таком Немного о разном 471 случае, можно использовать не только для отображения сообщения, но и для получения ответа от пользователя. Для этого в окне с сообщением отображается несколько кнопок, и при щелчке пользователя по одной из них программа определяет, какую именно кнопку нажал пользо- ватель. Все дело в том, что метод Show() класса MessageBox возвращает результат. Просто раньше мы его не использовали. Результатом метода является одна из констант из перечисления DialogResult. Эта константа определяет кнопку, которую нажал пользователь в диалоговом окне например, Abort, Cancel, Ignore, No, OK, Retry или Yes — название константы соответствует названию кнопки, по которой щелкает пользователь. Как все это используется на практике, иллюстрирует программа в листинге Листинг 9.1. Работа с диалоговым окном System.Windows.Forms; // Ƚɥɚɜɧɵɣ ɤɥɚɫɫ: class DialogResultDemo{ // Ƚɥɚɜɧɵɣ ɦɟɬɨɞ: static void Main(){ // Ɍɟɤɫɬɨɜɵɟ ɩɟɪɟɦɟɧɧɵɟ: string msg,title; // ɉɟɪɟɦɟɧɧɚɹ ɞɥɹ ɨɩɪɟɞɟɥɟɧɢɹ ɩɢɤɬɨɝɪɚɦɦɵ: MessageBoxIcon icn; // ɉɟɪɟɦɟɧɧɚɹ ɞɥɹ ɨɩɪɟɞɟɥɟɧɢɹ ɪɟɡɭɥɶɬɚɬɚ: DialogResult res; // Ɉɬɨɛɪɚɠɟɧɢɟ ɞɢɚɥɨɝɨɜɨɝɨ ɨɤɧɚ: res=MessageBox.Show( Ǝȼɚɦ ɧɪɚɜɢɬɫɹ C#?Ǝ,// ɋɨɨɛɳɟɧɢɟ ƎɊɢɬɨɪɢɱɟɫɤɢɣ ɜɨɩɪɨɫƎ, // Ɂɚɝɨɥɨɜɨɤ MessageBoxButtons.YesNo, // Ʉɧɨɩɤɢ MessageBoxIcon.Question // ɉɢɤɬɨɝɪɚɦɦɚ ); // ɉɪɨɜɟɪɤɚ ɪɟɡɭɥɶɬɚɬɚ: if(res==DialogResult.Yes){ // ȿɫɥɢ ɨɬɜɟɬ ƎȾɚƎ Глава 9 472 // Ɍɟɤɫɬ ɫɨɨɛɳɟɧɢɹ: msg= ƎȾɨɛɪɨ ɩɨɠɚɥɨɜɚɬɶ ɜ ɤɨɦɚɧɞɭ!Ǝ; // Ɂɚɝɨɥɨɜɨɤ ɨɤɧɚ: title= Ǝɇɚɲ ɱɟɥɨɜɟɤƎ; // ɉɢɤɬɨɝɪɚɦɦɚ: icn=MessageBoxIcon.Information; }else{ // ȿɫɥɢ ɨɬɜɟɬ ƎɇɟɬƎ // Ɍɟɤɫɬ ɫɨɨɛɳɟɧɢɹ: msg= Ǝɍ ȼɚɫ ɧɟɬ ɫɟɪɞɰɚ!Ǝ; // Ɂɚɝɨɥɨɜɨɤ ɨɤɧɚ: title= Ǝɇɟ ɦɨɠɟɬ ɛɵɬɶƎ; // ɉɢɤɬɨɝɪɚɦɦɚ: icn=MessageBoxIcon.Error; } // Ɉɬɨɛɪɚɠɟɧɢɟ ɨɤɧɚ ɫ ɫɨɨɛɳɟɧɢɟɦ: MessageBox.Show(msg,title,MessageBoxButtons.OK,icn); В этой программе объявляется несколько переменных. Текстовые переменные и title нам нужны для того, чтобы запомнить текст сообщения и заголовок окна (который отображается последним в программе. В переменную icn (типа MessageBoxIcon) будет записано значение константы из перечисления MessageBoxIcon, определяющее тип пиктограммы для окна. Переменная res типа DialogResult используется для определения результата при нажатии кнопки в диалоговом окне. В переменную res записывается результат вызова статического метода Show() из класса MessageBox. Третьим аргументом методу передается константа YesNo из перечисления MessageBoxButtons. Эта константа означает, что у окна будет две кнопки (Yes и No, или Да и Нет НАЗ А МЕТКУ Четвертый аргумент MessageBoxIcon.Question метода означает, что в окне отображается пиктограмма с вопросительным знаком Немного о разном 473 На рис. 9.1 показано, как выглядит первое окно (с вопросом, которое отображается при запуске программы на выполнение. Рис. 9.1. Вначале выполнения программы появляется диалоговое окно с кнопками Да и Нет Если пользователь нажимает в окне кнопку Да, то значением переменной будет константа Yes из перечисления DialogResult. Если пользователь нажмет кнопку Нетто в переменную res будет скопировано значение константы No из перечисления DialogResult. Поэтому условие res==DialogResult.Yes в условном операторе истинно, если пользователь нажал в диалоговом окне кнопку Да. В этом случае выполняются команды msg= ƎȾɨɛɪɨ ɩɨɠɚɥɨɜɚɬɶ ɜ ɤɨɦɚɧɞɭ!Ǝ, title= Ǝɇɚɲ ɱɟɥɨɜɟɤƎ и icn=MessageBoxIcon.Information. В противном случае (если условие res==DialogResult.Yes ложно) выполняются команды msg= Ǝɍ ȼɚɫ ɧɟɬ ɫɟɪɞɰɚ!Ǝ, title=Ǝɇɟ ɦɨ- ɠɟɬ ɛɵɬɶƎ и icn=MessageBoxIcon.Error. Но при любом исходе переменные msg, title и icn получают значения и после условного оператора выполняется команда MessageBox.Show(msg,title, MessageBoxButtons.OK,icn) , которой отображается еще одно окно с сообщением. Параметры данного окна (текст сообщения, заголовок и пиктограмма) зависят оттого, какую кнопку пользователь нажал в предыдущем окне. На рис. 9.2 показано окно, которое отображается в случае, если пользователь в первом окне нажал кнопку Да. Рис. 9.2. Такое окно появляется, если пользователь нажал кнопку Да Глава Если пользователь нажмет в первом окне кнопку Нетто появится окно, показанное на рис. Рис. 9.3. Такое окно появляется, если пользователь нажмет кнопку Нет НАЗ А МЕТКУ Напомним, что тип пиктограммы в окне определяется константой и Warning ) из перечисления MessageBoxIcon . Количество и название кнопок в диалоговом окне определяется константой и YesNoCancel ) из перечисления Использование пространства имен Надежа-царь говорит, что я князь Милослав- ский. Устраивает это вас? из к/ф Иван Васильевич меняет профессию» Мы многократно использовали самые разные пространства имен. Теперь пришло время познакомиться с концепцией пространства имен поближе. Для начала отметим, что пространство имен используется для определения области уникальности имен названия классов, структур, делегатов, интерфейсов и перечислений, объявленных водном пространстве имен, должны быть уникальными. Другими словами, пространство имен — это некоторое множество классов и других утилит, ив пределах пространства имен названия этих утилит не могут совпадать. Например, два класса водном и том же пространстве не могут иметь одинаковые названия. Зато если классы относятся к разным пространствам имен, то названия классов могут и совпадать Немного о разном НАЗ А МЕТКУ Пространства имен могут содержать в себе другие пространства имен. Обращение к таким внутренним пространствам имен выполняется с использованием точечного синтаксиса указывается вся цепочка вложенных пространств имена названия пространств разделяются точкой. Например, если пространство имен Third находится в пространстве имена пространство Second находится в пространстве имен First , то для обращения к пространству имен Third используется выражение Мы уже знаем, что если в программе нужно использовать пространство имен, тов начале файла с программой размещается инструкция using , после которой указывается название пространства имен. В результате классы, структуры и прочие утилиты, описанные в пространстве имен, станут доступны в программе. Если пространство имен не подключено с помощью инструкции using, то для обращения к утилитам из этого пространства необходимо перед именем утилиты (например, класса, структуры, интерфейса) указывать название пространства имен. Например, если класс MyClass описан в пространстве имен MySpace , то обращение к такому классу выполняется инструкцией вида Мы можем не только подключать уже существующие пространства именно и описывать собственные. Делается это просто после ключевого слова namespace указывается название пространства имени в блоке из фигурных скобок описываются классы, структуры, интерфейсы, перечисления и делегаты, которые входят в это пространство имен НАЗ А МЕТКУ Описание пространства имен может быть разбито на несколько блоков. Другими словами, мы можем описывать пространство имен не все сразу, а по частям». Следовательно, шаблон описания пространства имен следующий ɢɦɹ{ // ɋɨɞɟɪɠɢɦɨɟ ɩɪɨɫɬɪɚɧɫɬɜɚ ɢɦɟɧ } Глава В листинге 9.2 представлен небольшой пример, иллюстрирующий процесс описания пространства имен. В этой программе описаны два пространства имении каждое пространство имен содержит описание класса MyClass (то есть пространства имен содержат разные классы с совпадающими названиями). |