| 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. Вот как выглядит результат работы этой программы:

Когда вы щелкаете по кнопке 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");
}
}
На моем компьютере эта программа выводит такое окно сообщений:

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