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

Окно сообщений

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

MessageBoxHelloWorld.cs

  //-----------------------------------------------------
  // MessageBoxHelloWorld.cs (C) 2001 by Charles Petzold
  //-----------------------------------------------------

  class MessageBoxHelloWorld
  {
      public static void Main()
      {
          System.Windows.Forms.MessageBox.Show("Hello, world!");
      }
  }

Эта программа очень похожа на оригинальную программу ConsoleHelloWorld из главы 1. В ней есть класс (MessageBoxHelloWorld), метод класса с именем Main, который является точкой входа в программу, и единственная исполняемая инструкция, делающая почти то же самое, что и ее консольный аналог. Длинное имя функции разбивается на части следующим образом:

Поскольку Show — это статический метод, он должен предваряться именем класса и не требует создания объекта класса, точно так же как метод WriteLine класса Console. Вот как выглядит результат работы этой программы:


Рис. 2.1.

Когда вы щелкаете по кнопке OK, диалоговое окно закрывается, выполняется возврат из метода Show и работа программы завершается.

System.Windows.Forms — гигантское пространство имен, содержащее около 200 классов и 100 перечислений, а также 41 делегат, 7 интерфейсов и 4 структуры. Пространства имен System и System.Drawing наиболее важные в этой книге. Обычно в начало программы Windows Forms помещается инструкция

  using System.Windows.Forms;

и в результате на статический метод Show класса MessageBox можно ссылаться следующим образом:

  MessageBox.Show("Hello, world!");

Скорее всего, работая с Windows вы видели множество различных окон сообщений. Они всегда содержат краткое сообщени для пользователя и позволяют ответить щелчком по кнопке. Количество кнопок изменяется от одной до трех. Иногда сообщение предваряется значком, и у окна есть информативный заголовок. Програмисты чсто используют окна сообщений для отладки, поскольку они предоставляют простой способ отобразить текстовую информацию и приостановить выполнние програмы.

Класс MessageBox является потомком Object и наследует несколько методов, реализуемых Object. Единственный метод, реализуемый MessageBox самостоятельно — Show. Это статический метод, для которого существует 12 различных версий. Вот семь из них:


Различные версии метода Show класса MessageBox



  DialogResult Show(string strText)
  DialogResult Show(string strText, string strCaption)
  DialogResult Show(string strText, string strCaption,
                    MessageBoxButtons mbb)
  DialogResult Show(string strText, string strCaption,
                    MessageBoxButtons mbb, MessageBoxIcon mbi)
  DialogResult Show(string strText, string strCaption,
                    MessageBoxButtons mbb, MessageBoxIcon mbi)
  DialogResult Show(string strText, string strCaption,
                    MessageBoxButtons mbb, MessageBoxIcon mbi,
                    MessageBoxDefaultButton mbdb)
  DialogResult Show(string strText, string strCaption,
                    MessageBoxButtons mbb, MessageBoxIcon mbi,
                    MessageBoxDefaultButton mbdb, MessageBoxOptions mbo)


Остальные перегруженные методы Show используются для взаимодействия с кодом Win32.

Выводимый в заголовке окна сообщения текст обычно является именем приложения. Вот альтернативнй вызов MessageBox.Show для нашей первой программы Windows Forms:

  MessageBox.Show("Hello, world!", "MessageBoxHelloWorld");

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

Чтобы выбрать, какие кнопки будут в окне сообщения следует указать одно из значений перечисления:


Перечисление MessageBoxButtons



Член перечисления Значение

OK 0
OKCancel 1
AbortRetryIgnore 2
YesNoCancel 3
YesNo 4
RetryCancel 5


Например, кнопки ОК и Cancel (Отмена) покажет такой вызов:

  MessageBox.Show("Hello, world!", "MessageBoxHelloWorld",
                  MessageBoxButtons.OKCancel);

При использовании одной из версий MessageBoxSbow без этого параметра показывается только кнопка ОК. Кнопки AbortRetryIgnore восходят к печально известному сообщению MS-DOS, которое выводилось при попытке обратиться к устройству (обычно дисководу), которое почему-либо не отвечало. В графических средах использовать эти кнопки, пожалуй, не стоит, если только вы не стремитесь выглядеть до смешного старомодным.

Кроме того, можно указать одно из значений перечисления MessageBoxIcon чтобы вывести в окне сообщений значок:


Перечисление MessageBoxIcons



Член перечисления Значение

None 0x00
Hand 0x10
Stop 0x10
Error 0x10
Question 0x20
Exclamation 0x30
Warning 0x30
Asterisk 0x40
Information 0x40


Как можно видеть по значениям, в информационных окнах на самом деле используются только четыре уникальных значка. Вот пример показа окна со значком:

  MessageBox.Show("Hello, world!", "MessageBoxHelloWorld",
                  MessageBoxButtons.OKCancel, MessageBoxIcon.Exclamation);

Если задано значение MessageBoxButtons, соответствующее двум или трем кнопкам, можно задействовать перечисление MessageBoxDefaultButton, определяющее кнопку по умолчанию:


Перечисление MessageBoxDefaultButton



Член перечисления Значение

Button1 0x000
Button2 0x100
Button3 0x200


Например, вызов:

  MessageBox.Show("Hello, world!", "MessageBoxHelloWorld",
                  MessageBoxButtons.OKCancel, MessageBoxIcon.Exclamation,
                  MessageBoxDefaultButton.Button2);

делает вторую кнопку — Cancel (Отмена) — кнопкой по умолчанию. После появления окна сообщения именно она является выделенной и реагирует на ввод с клавиатуры, например, на нажатие пробела.

Еще одно перечисление, используемое методом Show класса MessageBox, — MessageBoxOptions — определяет параметры окна:


Перечисление MessageBoxOptions



Член перечисления Значение

DefaultDesktopOnly 0x020000
RightAlign 0x080000
RtlReading 0x100000
ServiceNotification 0x200000


Однако эти параметры применяются редко.

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


Перечисление DialogResult



Член перечисления Значение

None 0
OK 1
Cancel 2
Abort 3
Retry 4
Ignore 5
Yes 6
No 7


Вот пример использования возвращаемого MessageBox.Show значения:

  DialogResult dr = MessageBox.Show("Do you want to create a new file?",
                                    "WonderWord",
                                    MessageBoxButtons.YesNoCancel,
                                    MessageBoxIcon.Question);
  if {dr == DialogResult.Yes)
  {
      // Обработка "Да" (Yes)
  }
  else if (dr == DialogResult.No)
  {
      // Обработка "Нет" (No)
  }
  else
  {
      // Обработка "Отмена" (Cancel)
  }

Можно использовать и конструкцию switch/case, скажем, так:

  switch (MessageBox.Show("Do you want to create a new file?",
                          "WonderWord",
                          MessageBoxButtons.YesNoCancel,
                          MessageBoxIcon.Question))
  {
  case DialogResult.Yes:
       // Обработка "Да" (Yes)
       break;
  case DialogResult.No:
       // Обработка "Нет" (No)
       break;
  case DlalogResult.Cancel:
       // Обработка "Отмена" (Cancel)
       break;
  }

Иногда окна сообщений бывают полезны, если нужно быстро что-то посмотреть. Допустим, вы хотите показать имя каталога Windows с псевдонимом My Documents (Мои документы). Эту информацию можно получить с помощью класса Environment пространства имен System, используя статический метод GetFolderPath с одним параметром — членом перечисления Environment.SpecialFolder. Эти два имени отделяются точкой, так как SpecialFolder — перечисление, определенное в классе Environment.

MyDocumentsFolder.cs

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

  class MyDocumentsFolder
  {
      public static void Main()
      {
          MessageBox.Show(
              Environment.GetFolderPath(Environment.SpecialFolder.Personal),
              "My Documents Folder");
      }
  }

На моем компьютере эта программа выводит такое окно сообщений:


Рис. 2.2.


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

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