netlib.narod.ru< Назад | Оглавление | Далее >

Кнопки и щелчки

Наверное, основной элемент управления — кнопка, этот вездесущий прямоугольный объект, на котором часто написано ОК, Отмена, Открыть или Сохранить. Кнопки (иногда их называют командными) предназначены для немедленного выполнения некоего действия. Можно щелкнуть мышью по кнопке, либо, если фокус ввода находится на кнопке, нажать пробел. Иногда можно нажать кнопку, даже когда на ней не находится фокус ввода, нажав Enter или Esc. Далее в этой главе я рассмотрю использование клавиши Enter, а еще об Enter и Esc мы поговорим в главе 16.

Кнопка реализована в классе Button, являющимся одним из трех наследников абстрактного класса ButtonBase:


Рис. 12.1.

Классы CheckBox и RadioButton мы обсудим ниже.

В программе Windows Forms элемент управления «кнопка» создается при создании объекта типа Button. Кнопка сообщает форме о том, что ее нажали, используя установленный для нее обработчик события Click. Программа SimpleButton создает единственную кнопку, при щелчке по которой форма выводит некий текст.

SimpleButton.cs

  //---------------------------------------------
  // SimpleButton.cs (C) 2001 by Charles Petzold
  //---------------------------------------------
  using System;
  using System.Drawing;
  using System.Windows.Forms;

  class SimpleButton: Form
  {
      public static void Main()
      {
          Application.Run(new SimpleButton());
      }
      public SimpleButton()
      {
          Text = "Simple Button";

          Button btn   = new Button();
          btn.Parent   = this;
          btn.Text     = "Click Me!";
          btn.Location = new Point(100, 100);
          btn.Click   += new EventHandler(ButtonOnClick);
      }
      void ButtonOnClick(object obj, EventArgs ea)
      {
          Graphics grfx   = CreateGraphics();
          Point    ptText = Point.Empty;
          string   str    = "Button clicked!";

          grfx.DrawString(str, Font, new SolidBrush(ForeColor), ptText);
          System.Threading.Thread.Sleep(250);
          grfx.FillRectangle(new SolidBrush(BackColor), 
               new RectangleF(ptText, grfx.MeasureString(str, Font)));

          grfx.Dispose();
      }
  }

Задав текст заголовка окна, конструктор формы создает объект типа Button:

  Button btn = new Buttonf);

Класс Button имеет только конструктор по умолчанию.

Далее следует сделать одну вещь, о которой лично я часто забываю, поэтому я и приучил себя делать это сразу после создания элемента управления: нужно указать его родительский элемент. Для этого предназначено свойство Parent элемента управления:

  btn.Parent = this;

Ключевое слово this указывает на текущий объект, в нашем случае на форму — объект типа SimpleButton созданный в методе Main. Так что кнопка становится дочерним элементом формы.

Концепция родительских отношений широко применяется в программировании. Так, существуют родительские и дочерние процессы, родительские и дочерние папки, родительские классы и классы-потомки. Следовательно, концепция родительских отношений является базовой для языков программирования и ОС. Элементы управления тоже должны иметь предков! Элемент управления без предка невидим. Когда вы задаете свойство элемента управления Parent, вы на самом деле указываете следующую связь между родителем и элементом управления:

Вернемся к SimpleButton. Следующее выражение в конструкторе присваивает текст свойству кнопки Text:

  btn.Text = "Click Me!";

который выводится на поверхности кнопки. Выражение:

  btn.Location = new Point(100, 100);

указывает, где должен находиться левый верхний угол кнопки относительно левого верхнего угла клиентской области родителя. Здесь я просто прикинул, где примерно будет располагаться центр формы, и поместил кнопку туда. Далее я покажу, как определять координаты точнее. В Control реализованы все свойства расположения и размера, приведенные в главе 3. Для любых потомков Control, кроме Form, значение свойства ClientSize обычно равно значению свойства Size.

Кстати о размере. Вы, наверное, заметили, что я не указал размер кнопки. Я не сделал этого потому, что надеюсь, что кнопка с размером по умолчанию отлично подойдет для наших целей. А если нет, то неудачный размер кнопки будет нам хорошим уроком.

И наконец, форма устанавливает для кнопки обработчик события Click:

  btn.Click += new EventHandler(ButtonOnClick);

Кнопка вызывает событие Click, когда по ней щелкают или если на ней находится фокус ввода и пользователь нажимает пробел. Так как далее мы будем устанавливать много обработчиков событий, я буду придерживаться стандартной схемы наименования. В этой схеме имя обработчика события состоит из типа объекта (у нас это Button), возможно, еще одного описательного слова, если класс содержит более одного обработчика для конкретного события объекта конкретного типа, слова On и имени события — у нас это Click.

Метод ButtonOnClick должен быть определен в соответствии с делегатом EventHandler. Метод принимает два параметра:

  void ButtonOnClick(object obj, EventArgs ea)
  {
      ...
  }

В SimpleButton событие ButtonOnClick просто выводит строку текста в левом верхнем углу клиентской области и стирает ее через 1/4 секунды.

Заметьте: хотя ButtonOnClick обрабатывает событие Click кнопки, обработчик сообщения является методом класса SimpleButton. Так, когда метод ButtonOnClick вызывает CreateGraphics, он создает объект Graphics, относящийся к форме, а не к кнопке. Если в методе ButtonOnClick надо обратиться к свойствам или методам кнопки, нужно привести параметр object примерно так:

  Button btn = (Button)obj;

С другой стороны, объект Button может храниться как поле класса SimpleButton.

Кроме того, не надо путать метод, названный мной ButtonOnClick, с обычным методом OnClick. Если бы в SimpleButton был бы переопределен метод OnClick, этот метод получал бы сообщения о щелчках по форме, а не по кнопке. При щелчке по кнопке вызывается метод ButtonOnClick. Прищелчку по другому месту клиентской области формы вызывается метод OnClick.

Окно программы SimpleButton выглядит так:


Рис. 12.2.

Нажать кнопку (и инициировать вывод текста методом ButtonOnClick) можно мышью или нажатием пробела либо клавиши Enter.


netlib.narod.ru< Назад | Оглавление | Далее >

Сайт управляется системой uCoz