Г. Шилдт - С# 3.0 Полное руководство. 2010 (1160798), страница 191
Текст из файла (страница 191)
Два способа создания приложений на основе форм для Фабоиз Прежде всего следует отметить, что в пакет Ъ'!зца! Бент)!о входит целый набор развитых инструментальных средств, автоматизирующих большую часть процесса разработки приложения для %!пк!отчз. С помощью этих средств можно визуально конструировать и размещать различные элементы управления н меню в окне разрабатываемого приложе- Глава 26. Создание приложений нв основе форм длн рйпеоиз 945 ния. В Ч1зпа! Бгпг!!о можно даже "набросать" вчерне классы и методы, необходимые для каждой функции приложения. Откровенно говоря, при создании большинства реальных приложений для %!пбоигз лучше всего пользоваться инструментальными средствами разработки из пакета ЧЬпа) Бтнг!!о, хотя это и не обязательное правило.
Ведь исходный текст программы для %)пг)ем з можно написать и в обычном текстовом редакторе, а затем скомпилировать ее подобно консольному приложению. Эта книга посвящена языку программирования С(), а не пакету разработки Чнша1 ззпйо, и поэтому примеры программ для ЪЧ!пг!оигз из этой главы довольно кратки и представлены в том виде, в каком они написаны в текстовом редакторе. Тем не менее общая структура, конструкция и организация этих программ остаются такими же, как и у тех программ, которые создаются инструментальными средствами разработки в Чиша! Б(нг!!о, Таким образом, материал этой главы ориентирован на оба подхода к разработке приложений для ЪЧ)проке. Взаимодействие Надоив с пользователем Прежде чем программировать для ЪЪ))пбозгз, следует знать, каким образом пользователь взаимодействует с ЪЧ!пдокз, поскольку именно от этого зависит общая архитектура всех приложений для %)пг!емз.
Это взаимодействие коренным образом отличается от представленных ранее примеров консольных программ. Так, при написании консольной программы следует иметь в виду, что инициатором взаимодействия с операционной системой является сама консольная программа. Например, консольная программа сама запрашивает ввод или вывод, вызывая метод неаг(() или нгзкеьйпе(). Следовательно, консольные программы обращаются к операционной системе, а не наоборот. В то же время приложения для %задок з работают совсем иначе, поскольку в данном случае ЪЪ)(вбок з обращается к программе.
Это происходит следующим образом. Программа ожидает до тех пор, пока не получит от ЪЪ)(пг!овгз сообщение. Получив его, программа должна выполнить соответствующее действие. В частности, она может вызвать метод, определяемый в ЪЪ))пг)озгз, чтобы отреагировать на полученное сообщение, но инициатором всякого действия по-прежнему остаегся ЪЪ)(пдокз. Именно это взаимодействие с ЪЧ)пс(окз на основе сообщений, а не чтолибо другое определяет общую форму всех приложений для Мпг!ок з. Программа может получать от ЪЪ)(пг(омз самые разные виды сообщений. Например, при каждом щелчке кнопкой мыши в окне программы ей посылается сообщение об этом событии. Другой вид сообщения посылается при нажатии кнопки или выборе пункта меню. В связи с этим необходимо твердо усвоить следующее: сообщения, посылаемые программе, поступают в произвольном порядке.
Именно поэтому приложения для ЪЧ)пг!ока похожи на программы, управляемые по прерываниям. Программе заранее неизвестно, какое именно сообщение будет следующим. Формы для МЛпбоиз В основу приложений для ЪЧ)пг!очгз, создаваемых на С(), положена форма, в которой инкапсулированы базовые функции, необходимые для создания окна, его отображения на экране и получения сообщений. Форма может представлять любой вид окна, включая главное окно приложения, порожденное окно и даже диалоговое.
Вновь созданная форма оказывается пустой. Для того чтобы снабдить форму определенными функциями, в нее добавляются меню и такие элементы управления, как экранные кнопки, списки и флажки. Таким образом, форму можно рассматривать в качестве контейнера для других объектов ЪЧ)пг(окз. 946 Часть (!. Бнбяиогега Сз Когда окну посылается сообщение, оно преобразуется в событие. Поэтому для обработки сообщения, поступающего от %(пс(ошз, достаточно зарегистрировать для него соответствующий обработчик событий в форме. После этого обработчик событий будет вызываться автоматически при каждом получении этого сообщения. КлаСС Голыш Для создания формы следует получить экземпляр объекта класса Гоги или любого другого производного от него класса.
У самого класса Гоги имеется достаточно функциональных возможностей, но помимо них он наследует дополнительные функции от двух наиболее важных базовых классов: Яузсеш. Сошропепсмоое1. Сошропепт (поддерживает компонентную модель .НЕТ); а также Яуз тем. И1пс(онз . Гогшз "опгго1. В классе Сопаго1 определяются общие функции для всех элементов управления в %(п()овэ. Эти же функции доступны и в классе Гоги, поскольку он наследует от класса Сопт го1. В приведенных ниже примерах используется несколько членов классов ропп и сопсго1.
Скелетный вариант приложения на основе форм для Мпбоив Рассмотрим сначала пример создания простейшего приложения на основе форм для %(пдо(уз. В этом приложении только создается и отображается окно. В нем отсутствуют какие-либо другие функции. Тем не менее этот скелетный вариант приложения наглядно демонстрирует порядок построения полноценно функционирующего окна.
Это именно тот каркас, на котором можно создавать большинство приложений для %(пдовэ, ниже приведен исходный код скелетного варианта приложения на основе форм для %(ппотуз. // Скелетный вариант приложения на основе форм // для Игпсонв. пв1пЧ Яуввеьм овалу Яувоеш.ИТппонв.Гогшв) // Класс ИапБХе1 является производным от класса Гопп.
с1авв И1пзхе1: Гоги ( роо11с И1пзке1() ( // присвоить окну наименование. ТехТ = "Скелет приложения для Итпоонв"; ) // Метод Маап() служит лишь для запуска приложения. (ЯТАТЬгеао] впаптс тото Маап() ( Иапзке1 вхе1 = пен И1пзке1(); // создать форму // Активизировать стили оформления. Арр11сапаоп . БпаЬ1еуавоа15ву1ев () ) // Запустить механизм функционирования окна.
Арр11саогоп.кап(вке1)) ) Ггааа 26. Создание приложений на огноае ферм длл ггдпиоез 947 ОКно ггггзггннме и зтмд ггггю егммг* Нммии|г~ггг нг емг Об! Иггггнг1ини гивеем агж нзип-- 948 Часть )!. Библиотека С» методу Маап () в программе для Ж(пооткэ. Он задает модель однопоточного подразделения (ЯТА) для программы. (Обсуждение поточных моделей выходит за рамки этой главы, но вкратце следует пояснить, что в приложении для ЪЧпг(ов з может использоваться одна из двух разных поточных моделей: одно- или многопоточного подразделения.) В методе Маап () создается объект зке1 класса И(пзхе1.
Затем вызывается метод Лрр11сакаоп. Епа)э1е)таэиа15ту1ез (), который актизизирует стили оформления (темы), если они поддерживаются операционной системой. Формально этого в приложении на основе форм Н(т(пс(ов'з Гогшз не требуется, но стили оформления улучшают внешний вид элементов управления в окне приложения и поэтому рекомендуются для обязательного применения. Данный метод должен вызываться первым в методе Маап () . Класс Арр11сат1оп определен в пространстве имен зузтет. Иъпйоиз. рогпэ и инкапсулирует общие аспекты всех приложений для Ъ(т(пт)отче. Далее объект зке1 передается методу Ноп (), который также определен в классе Арр11сатаоп, как показано ниже.
Лрр11сак1оп.асп(аие1)т При этом запускается механизм функционирования окна. Ниже приведена общая форма метода нип (), применяемая в рассматриваемом здесь скелетном варианте приложения для %)пк(онз. ро)т11с экакас чоат) Нип(гоги форма) Этот метод принимает ссылку на объект формы в качестве своего параметра.
А поскольку класс иапзхе1 наследует от класса рогат, то объект типа иапвхе1 может быть передан методу ноп ( ) . В результате выполнения рассматриваемой здесь программы создается и отображается окно, приведенное на рис. 26.1. Это окно имеет устанавливаемые по умолчанию размеры и является полноценно функционирующим. В частности, его можно изменить по размеру, переместить, свернуть, развернуть и закрыть. Следовательно, для того чтобы создать окно с базовыми функциями, присущими практически всем окнам в тлбпт!очка, достаточно написать всего лишь несколько строк кода приложения на основе форм. С другой стороны, для написания аналогичной программы на С с непосредственным обращением к прикладному интерфейсу АР! потребовалось бы приблизительно в пять раз больше строк кода! Из анализа приведенного выше скелетного варианта можно сделать общий вывод для всех приложений, разрабатываемых на основе форм для ЪЧпс(ов з.