Г. Шилдт - С# 3.0 Полное руководство. 2010 (1160798), страница 192
Текст из файла (страница 192)
Для получения формы создается класс, наследующий от класса гогж А для инициализации формы, отвечающей конкретным потребностям, создается объект этого производного класса, который затем передается методу Арр11сагаоп. рап () . Компилирование скелетного варианта приложения для (й(!пбоав Приложение для ЪЧ(пботкз может быть скомпилировано с помощью компилятора командной строки или пакета Н(зпа! Згнп(о. Для компиляции коротких программ, как в приведенных в этой главе, удобнее пользоваться компилятором командной строки, тогда как реальные приложения лучше компилировать в интегрированной среде разработки типа Ниша! Вснк((о, где можно также пользоваться упоминавшимися ранее инструментальными средствами разработки.
Далее рассматриваются оба способа компиляции приложений для ЪИпк)отса. Глава 26. создание приложеиий иа основе форм дяя ийоооия 949 Компилирование из командной строки Если присвоить имя Игпахе1. сэ файлу исходного текста скелетиого варианта приложения для %)пдоьъ, то для его компилироваиия из командной строки достаточно ввести следующую команду: свс /Сцидвехе Илвйсе1.св Параметр командной строки ус: ивпехе предписывает компилятору создать приложение для %)пг)овгз, а ие консольное приложение. Для выполнения скомпилированного приложения достаточно ввести И1пзхе1 в командной строке. Компилирование в среде Ч~внв! ВйнКо Для того чтобы скомпилировать приложение для %)пбоъз в интегрированной среде разработки Ч|зпа! Згп)))о, создайте сначала новый проект ихпооиз йрр11сас1оп по команде Файл Создать проект.
Затем выберите шаблон Приложение %)пс)оаз Рого)з (%)пг)о)сз Еогшз Арр!)саг)оп) в диалоговом окне Создать проект. Присвойте новому проекту имя Нвпзхе1. Удалите из него все автоматически созданные файлы исходного кода С№. Затем щелкните правой кнопкой мыши иа имени проекта Игпаие1 и выберите из контекстного меню команду Добавитьосоздать элемент. Далее выберите шаблон файл с текстом программы в диалоговом окне Добавление нового элемента и присвойте файлу исходного текста имя Муи1орго) ест.
сз. После этого введите исходный код скелетиого варианта приложения для %!пдоч з так, как было представлено выше, и постройте решение. Для выполнения программы из данного проекта выберите команду Отладка Запуск без отладки. Создание экранной кнопки В целом функции окна выражаются двумя разными типами элементов: меню и элементами управления. Благодаря именно этим элементам пользователь взаимодействует с программой. О меню речь пойдет далее в этой главе, а ниже будет показано, как в окно добавляется такой элемент управления, как экранная кнопка.
В %)пдо)чз определяется много разных элементов управления, в том числе экранные кнопки, флажки, кнопки-переключатели и списковые окна. Несмотря иа отличия между разными типами элементов, все оии действуют более или менее одинаково. Далее речь пойдет о добавлении экранной кнопки, ио аналогичным способом можно добавить в окно и другие типы элементов управления.
Основные положения о кнопках Функции экранной кнопки иикапсулируются в классе Виогоп. Ои наследует от класса ВцССопваэе, который в свою очередь наследует от класса СооСго1. В классе ВоССоп определен только один конструктор: риьььс Вотссп и Этот конструктор создает кнопку стандартного размера и выбираемого по умолчанию местоположения в окне. У иее отсутствует надпись. Перед тем как воспользоваться киопкой, необходимо дать ей какое-то описание, присвоив его в виде строки свойству теис данной кнопки.
950 Часть П. Библиотека С» Для того чтобы указать конкретное местоположение кнопки в окне, необходимо присвоить координаты левого верхнего угла кнопки свойству Ьосаггоп. Это свойство наследуется из класса сопсго1 и определяется следующим образом: риЫ1с Ро1вс Ьосаг1оп [ чеС; яегт Упомянутые выше координаты содержатся в структуре Рогпс, определенной в пространстве имен ЯузСев.
Вгаи1пср В нее включены два свойства: рнЫгс гвг Х ( дега яегт ! риЬ11с гпс у ( дег) яегт Таким образом, для создания экранной кнопки, имеющей надпись "Щелкните здесь" и располагаемой в точке с координатами ()00, 200), достаточно написать следующий фрагмент кода: Воггоо МуВиггоп = вен ВиССоп()т Мувиггов.тенг = "Щелкните здесь"> Мувиггов.ьосаггоп = вен РогпС(100, 200)т Добавление кнопки в форму После того как кнопка будет создана, ее нужно добавить в форму. Сагой целью вызывается метод дг)с( () для коллекции элементов управления, связанных с данной формой.
Эта коллекция доступна с помощью свойства Сопгго1з, наследуемого из класса Сопгго1. Ниже приведена общая форма объявления метода )(с(г) () . рвЫгс тгггнв1 тоьб Лбб(соогго1 соС1) где спС1 обозначает добавляемый элемент управления. После добавления элемента управления в форму он будет отображаться вместе с самой формой. Простой пример ввода кнопки В приведенном ниже примере программы кнопка вводится в разработанный ранее скелетный вариант приложения для Ж)поо)уя. Эта кнопка пока еще не наделена никакими функциями, но только присутствует в форме и может быть нажата щелчком на ней кнопкой мыши.
// Добавить кнопку. иятнч Яуягвли ияьпо Яуягев.нгпбонв.Гогвят интой Яуясев.пгантодт с1аяя ВоССопГогв: Гоги ( Внггов МуВнггогп риЬ11с ВнггопГогв() ( Техг = "Применение кнопки"; МуВиггов = вен Виггов()) МуВиггон.техг = "Щелкните здесь"; МуВнггоп.ьосяегоп = пен Ро1пг(100, 200) МуВиССон.наНСЬ = 110; Гоавв 2о Создание нрилонений на основе форо для ЧИооав 951 952 Часть )(. Библиотека С№ ме в виде сообщений.
В программе на С№, разработанной на основе форм, эти сообщения обрабатываются специальным обработчиком событий. Поэтому для получения сообщений в такую программу вводится свой собственный обработчик событий, добавляемый в список обработчиков, вызываемых при формировании сообщений. Так, для обработки сообщений о нажатии кнопки в программу вводится обработЧик события С11с)с.
Событие с11с«указывается в классе сопсго1 и определяется в классе Впгсоп. Ниже приведено его общая форма. рпЫ1с Етепс Етепсиапб1ег 011с)тт Делегат Еуепсиапб1ег объявляется так, как показано ниже. рнЬ11с бе1едасе тога Енепгнапб1ег(оЬбесс нпо, Етепсйгдв агдв) где иио обозначает объект, сформировавший событие, а агдв — любые данные, связанные с событием.
Для многих событий агдв обозначает объект класса, производного от класса еуепсйгдз. Но поскольку щелчок на кнопке не требует никакой дополнительной информации, то для обработки такого события дополнительные данные, передаваемые в качество аргументов, нс нужны. В приведенном ниже примере программы код реакции на нажатие кнопки добавляется в предыдущий пример программы. При каждом нажатии кнопки ее местоположение меняется. // Обработка сообщений от кнопки. пвгпд 5увсесп пвгпд зувсещ.игпдоив.Гоплв; нв1пд зувсещ.пгаигпд; с1авв Виссопгогщ: Гоги ( впссоп мувнгсопт рпЫгс Внггопуогщ() ( ТехТ = "Реагирование на нажатие кнопки"; Мувнггоп = пеи Во«гоп()1 Мувпссоп.тех« = 'Таедкните здесь","' МуВпггоп.ьосаггоп = пен Ро1пг(100, 200) Муз Скоп.нгб«Ь = 110т // Добавить обработчик события от кнопки в список.
МГВпгсоп.С11с« += МуВпсгопСгас«п Сопсго1в.йк(б(мувпгсоп)т ) (5ТАТЬгеас() всасгс тога Маго() ( Впссопуогщ в«е1 = пен ВпссопГогщ() Арр11саггоп.ЕпаЫеогвпа15«у1ев()т Арр11сасгоп.кпп(в«е1)т ) Глава 26. Создание приложений нв основе форм для Уйппоив 953 О Обработчик события от кнопки Мувпппоп. чоуб МуВпсвопС11си(оЬ)есп ипо, Ечеппптчв е) ( Ьг(муВпгсоп.тор == 200) Мувпплоп.ьосапуоп = пеи Роупл(10, 10); е1ае МуВпеаоп.ЬосаСЬоП = Пии Роупп(100, 200); ) ) Рассмотрим более подробно код обработки событий в данной программе.
Ниже приведен обработчик событий в связи с нажатием кнопки. // Обработчик событий от кнопки Мувплпоп. чо1б МуВптвопС11ск(оЬ)есп иио, Ечеппхгпв е) ( ЬГ(муВпвиоп.тор == 200) Мувппвоп.ьосапзоп = пеи Ро1пп(10, 10); е1ае МуВиппоп.ьосалуоп = пеи Ро1пп(100, 200); ) Обработчик событий МувпбеопС11сх () совместим с упоминавшимся ранее делегатом Ечепснапс)1ег.
Это означает, что ои может быть введен в цепочку событий. Обратите внимание иа то, что ои закрыт в классе Вппгопропп. Формально это ие требуется, ио целесообразно, поскольку обработчики событий предназначены только для вызова в ответ иа возникающие события. Местоположение кнопки определяется в обработчике событий с помощью свойства тор. Для всех элементов управления определены приведенные ниже свойства, обозначающие координаты левого верхнего и правого нижнего углов.
рпвуус Ьпп Тор ( чепя лепя ) рпЬ11с Ьпп Воплои ( цап; ) рпвуус Ьпс ьевс ( Челы вел; ) рпЬ11с ЬПС Ысьп ( деты ) Обратите виимаиие иа то, что местоположение элемента управления изменяется при установке свойств Тор и Ье гл, а ие свойств Во Слом и ВЬОЬС, поскольку эти последние доступны только для чтения. (Для изменения размеров элемента управления служат свойства И1г(СЬ и НеЬОЛЮ) Если при получении сообщеиия о нажатии кнопки (или щелчке иа ией) верхний край этого элемента управления находится в исходном положении, обозначаемом координатой 200, то его местоположение изменяется, получая новые координаты 10, 10.
В противном случае данный элемент управления возвращается в свое исходное положение с координатами 100, 200. Следовательно, при каждом нажатии экранной кнопки (или щелчке иа ией) ее местоположение меняется. Прежде чем получать сообщения, обработчик событий Мувпссопс11сх () должен быть введен в цепочку обработчиков, связаииых с событием с11ск от кнопки. Это делается в приведенном ниже операторе в конструкторе класса Вппеопрогпь мувпссоп.сдд н т= мувпссопсдь )ы После ввода обработчика событий Мувпсгопс11ск () в цепочку обработчиков, связанных с собьпием С11сх от кнопки, ои вызывается всякий раз, когда нажимается кнопка.
954 Часть )). Библиотека СЗ Альтернативная реализация Любопытно, что обработчик событий мувнссопс11ск () можно было бы написать несколько иначе. Напомним, что в качестве параметра нпо обработчик событий принимает ссылку на объект, формирующий его вызов. Если речь идет о событии, связанном с нажатием кнопки, то этим объектом является нажатая экранная кнопка. Таким образом, обработчик событий муВпссопс11ск () можно было бы написать следующим образом: // альтернативный вариант обработчика событий от кнопки. чоъб мувоссопс11 к(оь)есс ньо, ечепткгда е) ( Внппоп Ь = (Внкпоп) нпо; 11(Ь.тор == 200) Ь.ъосаььоп = пен Роьпь(10, 10); е1ае Ь.ъосапьоп = пен Роъпп(100, 200); ) В этом варианте обработчика событий ссылка на объект нпо приводится к типу виссоп, и для доступа к объекту кнопки используется именно эта ссылка, а не поле Мувиссоп.