Событийно-управляемая модель выполнения оконного приложения 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Событийно-управляемая модель выполнения оконного приложения



Исходный текст первого оконного приложения соответствует правилам языка C#: программа состоит из классов (одного класса Program) и имеет «точку входа» - метод Main. В нем выполняется оператор, выполнение которого и реализует поведение простого окна:

Application.Run(new Form());

Здесь «работает» статический метод Run класса Application. Класс Application предоставляет несколько статических методов и свойств для управления оконным приложением. Для создания оконного приложения необходимо уметь «запускать» оконное приложение – это и делает метод Run.

Теперь разберемся, что при этом происходит. В момент запуска на экране появляется изображение окна. Далее запускается цикл обработки событий. Событием называется порция информации, автоматически создаваемая операционной системой (Windows) в ответ на физическое или логическое внешнее воздействие. Например, пользователь щелкнул левой кнопкой мыши. В этом случае событие возникнет, если этот щелчок был выполнен по «особому» месту, например по кнопке, нарисованной в окне. Возникновение события еще не означает, что программа на него отреагирует каким-то ответным действием. Для этого необходимо, чтобы программист, создавший эту программу, реализовал программный фрагмент, отвечающий за реакцию на это событие. В терминах языка C# - это метод-обработчик события. После того, как этот метод завершит свою работу, программа переходит к ожиданию следующего «достойного внимания» события.

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

Такой цикл обработки событий завершается, когда возникает некоторой специальное событие, приводящее к завершению работы приложения.

Описанный здесь сценарий работы оконного приложения схематически изображен на следующем рисунке:

 

Мы видели, что даже первое оконное приложение уже реагирует на целый ряд стандартных событий. Где же обработчики этих событий? Эти обработчики определены в стандартном классе Form.

Наша первая программа, хотя и выглядит как стандартное окно Windows, является весьма пассивной, поскольку не реагирует ни на какие события, кроме «неинтересных» стандартных событий управления окном. Заставим программу действовать интереснее: когда пользователь щелкнет мышью по любой кнопке, на ее поверхности появится текущее время.

Для достижения этой цели необходимо выполнить 2 действия:

1. Написать специальный метод-обработчик для реакции на требуемое событие.

2. Связать этот метод с событием элемента управления.

Измененный текст программы теперь выглядит следующим образом:

01. using System;

02. using System.Windows.Forms;

03. using System.Drawing;

04. static class Program

05. {

06.   private static int FormHeight=300;

07.   private static int FormWidth=500;

08.   private static Form f;

09.   private static Button b1;

10.   private static Button b2;

11.   static void Main()

12.   {

13.     //создание и настройка формы

14.     f = new Form();

15.     f.ClientSize = new Size(FormWidth, FormHeight);

16.     //создание и настройка первой кнопки

17.     b1 = new Button();

18.     b1.Left = FormWidth / 5;

19.     b1.Top = FormHeight / 3;

20.     b1.Width = FormWidth / 5; //ширина кнопки

21.     b1.Height = FormHeight / 3; //высота кнопки

22.     b1.Click += ButtonClick;

23.     //создание и настройка второй кнопки

24.     b2 = new Button();

25.     b2.Bounds = new Rectangle(3*FormWidth / 5, FormHeight / 3, FormWidth / 5, FormHeight / 3);

26. b2.Click += ButtonClick;

27.     //добавление кнопок на форму

28.     f.Controls.Add(b1);

29.     f.Controls.Add(b2);

30.     //запуск цикла обработки событий

31.     Application.Run(f);

32.   }

33.      private static void ButtonClick(object sender, EventArgs ea)

34. {

35.     ((Button)sender).Text = DateTime.Now.ToString();

36. }

37. }

Полужирным шрифтом выделенны изменения в тексте.

1. В классе Program уже появился второй метод. В дальнейшем классы будут содержать довольно большое количество методов. Как Вы уже должны знать, эти методы могут безпрепятсвенно пользоваться общей для них информацией, содержащейся в переменных класса (даже если ети переменные закрыты – private). Поэтому важная информация, интенсивно используемая методами класса, обычно представлена переменными класса. В нашем примере переменными стали размеры окна FormHeight и FormWidth (стр.06 и 07), сама форма f (стр. 08) и кнопки b1 и b2 (стр. 09 и 10).

2. Метод-обработчик написан как метод класса Program (стр.33-36). При написании методов-обработчиков нужно соблюдать следующие требования:

А)   обработчик никогда ничего не возвращает (void);

Б)   первым параметром обработчика обычно является переменная типа object – общего базового класса всех классов.NET. Существуют ситуации, когда тип этого параметра может быть другим.

В)   вторым параметром обработчика является переменная класса EventArgs или производного от него.

Решение о том, что обработчик будет методом класса Program, не является обязательным требованием. В нашем случае это сделано для сохранения простоты программы. Использование модификаторов private и static также не является обязательным. В нашем случае обработчик является закрытым, потому что используется только в классе Program, а статическим потому, что используется в статическом методе Main.

3. Связь обработчика с событием-щелчком для кнопок b1 и b2 определена в стр. 22 и 26. Это обязательно делается оператором присваивания +=. Обратите внимание на «странность» этих операторов. Операция += в данном случае совсем не занимается арифметическим накоплением числовой информации. Правым ее операндом является название метода-обработчика. В то же время в левой части += указано событие Click для кнопки b1 и b2. Упрощенное (но в принципе правильное) представление о том, чем яляется событие – это список названий методов-обработчиков, которые срабатывают, когда с элементом управления происходит соответствующее внешнее воздействие. Разработчики классов для стандартных элементов управления предусмотрели для них довольно большой спектр событий.

 

В нашей программе обе кнопки используют одинаковый обработчик. Но ведь в процессе обработки надпись должна измениться именно на той кнопке, по которой щелкнул пользователь. Для этого и используется первый параметр обработчика – он ссылается на тот объект, с которым произошло событие. События могут происходить с любыми объектами (даже не визуальными элементами управления). Поэтому тип этого параметра – object. Внутри обработчика этот параметр нужно явным образом приводить к требуемому типу (в нашем случае – Button).

Для получения текущей даты и времени обработчик использует статическое свойство Now класса DateTime.



Поделиться:


Последнее изменение этой страницы: 2021-12-15; просмотров: 46; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.119.116.102 (0.008 с.)