- •Синтаксис функции CWnd::MessageBox
- •Отображение пиктограммы
- •Отображение кнопок
- •Помещение кнопки в фокус
- •Определение модальности окна сообщения
- •Коды кнопок, возвращаемые функцией MessageBox
- •Размещение сообщения в нескольких строках
- •Пример использования функции MessageBox
- •Синтаксис функции AfxMessageBox
- •Использование строковой таблицы
Лекция 9 |
Окно сообщений |
1 |
|
Л Е К Ц И Я |
9 |
ОКНО СООБЩЕНИЙ ____________________________________________________________________ 1
Синтаксис функции CWnd::MessageBox ____________________________________________________ 1 Отображение пиктограммы_______________________________________________________________ 1 Отображение кнопок ____________________________________________________________________ 2 Помещение кнопки в фокус_______________________________________________________________ 2 Определение модальности окна сообщения_________________________________________________ 2 Коды кнопок, возвращаемые функцией MessageBox __________________________________________ 2 Размещение сообщения в нескольких строках _______________________________________________ 3 Пример использования функции MessageBox________________________________________________ 3 Синтаксис функции AfxMessageBox ________________________________________________________ 3 Использование строковой таблицы ________________________________________________________ 4
ОКНО СООБЩЕНИЙ
Архитекторы прячут свои ошибки под плющом, врачи – под землёй, хозяйки – под майонезом, а программисты – за окнами сообщений.
Бернард Шоу
Окно сообщений (Message Box) – простейший вид формы с одной или несколькими стандартными кнопками, предназначенной для отображения сообщений. Окно сообщений целесообразно использовать в том случае, если программе необходимо запросить у пользователя информацию в форме ответа типа “Да” или “Нет”.
Окно сообщений требует реакции пользователя на отображённое сообщение. Пока на экране находится окно сообщений, программа находится в состоянии ожидания. В окне сообщений можно отобразить заголовок окна, текст сообщения, одну из четырёх предопределённых пиктограмм и один из шести наборов кнопок.
Синтаксис функции CWnd::MessageBox
Для работы с окном сообщений в классе CWnd объявлены две перегруженные функции, синтаксис которых имеет вид:
int MessageBox ( LPCTSTR lpszText , LPCTSTR lpszCaption = NULL , UINT nType = MB_OK ) ;
Функция отображает на экране окно сообщений с заданным набором кнопок и возвращает код, соответствующий нажатой кнопке.
Параметры функции:
lpszText |
обязательный параметр. Указатель на объект типа CString или строку, заканчивающую- |
|
ся нуль-терминатором. Строковое выражение, содержащее текст сообщения. Макси- |
nIDPrompt |
мальная длина строки –1024 символов; |
идентификатор сообщения в строковой таблице; |
|
lpszCaption |
необязательный параметр. Указатель на объект типа CString или строку, заканчиваю- |
|
щуюся нуль-терминатором. Строковое выражение, отображаемое в заголовке окна. |
|
Максимальная длина строки – около 60 символов, зависит от размера шрифта исполь- |
|
зуемого в заголовках окон. Если параметр равен NULL, то в заголовке отображается |
nType |
имя приложения; |
необязательный параметр. Выражение целого типа, содержащее сумму констант влияю- |
|
|
щих на вид пиктограммы, набор кнопок, положение фокуса, модальность окна. Если |
|
параметр не указан, то окно сообщений отображается без пиктограммы, содержит кноп- |
|
ку OK и является модальным внутри приложения. |
Отображение пиктограммы
Для отображения пиктограмм в окне сообщений рекомендуется использовать следующие идентификаторы констант, что упрощает чтение программы.
MB_ICONSTOP |
индикация серьёзной ошибки в программе, при которой она |
MB_ICONQUESTION |
аварийно завершает работу |
для продолжения работы программы требуется дополнитель- |
|
|
ная информация |
Выжол Ю.А. |
Программирование на Visual C++ |
Лекция 9 |
Окно сообщений |
2 |
MB_ICONEXCLAMATION индикация ошибки в программе, которая может быть исправлена после вмешательства пользователя
MB_ICONINFORMATION информация для пользователя о состоянии программы. Часто применяется при выполнении поставленной задачи
Отображение кнопок
Для отображения кнопок в окне сообщений рекомендуется использовать следующие идентификаторы констант, что упрощает чтение программы.
MB_OK |
используется для отображения информационных сообщений и для ос- |
MB_OKCANCEL |
тановки работы программы; |
используется для подтверждения выполнения определённой опера- |
|
MB_ABORTRETRYIGNORE |
ции или её отмены; |
используется при возникновении ошибки. Пользователю предлагается |
|
|
прекращение начатой операции, её повтор либо игнорирование ошиб- |
MB_YESNOCANCEL |
ки; |
пользователь может подтвердить одно из предложенных действий, |
|
MB_RETRYCANCEL |
либо отменить выполнение начатой операции; |
используется при работе с некоторым устройством, чтобы дать воз- |
|
|
можность пользователю повторить операцию после устранения непо- |
MB_YESNO |
ладки; |
пользователю предлагается выбрать один из двух возможных отве- |
|
|
тов. |
Если окно сообщений отображает кнопку Cancel, то щелчок на кнопке эквивалентен нажатию клавиши
Esc.
Помещение кнопки в фокус
Если в окне сообщений используется больше одной кнопки, то можно определить, какая из них должна находиться в фокусе. Как правило, в фокус помещается кнопка, на которой чаще всего приходится щёлкать пользователю. Ниже приведены значения параметра nType, влияющие на положение фокуса.
MB_DEFBUTTON1 первая кнопка является кнопкой по умолчанию;
MB_DEFBUTTON2 вторая кнопка является кнопкой по умолчанию;
MB_DEFBUTTON3 третья кнопка является кнопкой по умолчанию.
Определение модальности окна сообщения
Окно сообщений по умолчанию является модальным внутри приложения. Это значит, что невозможно выполнить никаких действий в приложении до тех пор, пока модальное окно не закрыто. Окно сообщений может быть также модальным в пределах операционной системы.
MB_APPLMODAL окно сообщений модально в рамках приложения; MB_SYSTEMMODAL окно сообщений модально во всей операционной системе.
Коды кнопок, возвращаемые функцией MessageBox
Функция MessageBox возвращает код кнопки, на которой щёлкнул пользователь. Для каждой кнопки предусмотрен свой код и, соответственно, своя константа.
Для анализа возвращаемого функцией MessageBox кода кнопки рекомендуется использовать приведённые ниже константы. После определения нажатой кнопки сохраните её код в переменной для последующего использования в программе.
IDABORT |
нажата кнопка Abort |
Прервать; |
IDCANCEL |
нажата кнопка Cancel |
Отмена; |
IDIGNORE |
нажата кнопка Ignore |
Пропустить; |
IDNO |
нажата кнопка No |
Нет; |
IDOK |
нажата кнопка ОК |
ОК; |
IDRETRY |
нажата кнопка Retry |
Повторить; |
IDYES |
нажата кнопка Yes |
Да. |
Функция MessageBox возвращает ноль, если в операционной системе недостаточно памяти для создания окна сообщений.
Выжол Ю.А. |
Программирование на Visual C++ |
Лекция 9 |
Окно сообщений |
3 |
Размещение сообщения в нескольких строках
Если текст сообщения достаточно длинный, то он будет автоматически разбит на несколько строк. Если это разбиение вас не устраивает, то вы можете выполнить разбиение сами с помощью символа ‘\n’. Допускается также использование символа табуляции ‘\t’.
Пример использования функции MessageBox
Если в приложении отсутствует кнопка закрытия окна и кнопка OK, то можно создать кнопку с надписью Exit с именем IDC_EXIT. При щелчке на этой кнопке на экране отображается окно сообщений. Если пользователь нажмёт кнопку Да – приложение закрывается.
//Функция обработки щелчка на кнопке IDC_EXIT void CMessageDlg :: OnExit ( )
{
//Объявление и инициализация строки сообщения
CString Message = "\t \t Вы \n \t действительно \n хотите завершить работу?" ;
//Объявление и инициализация строки заголовка
CString Title = "Завершение работы";
//Объявление и инициализация переменной стиля:
//окно сообщений содержит пиктограмму со знаком вопроса, кнопки Да и Нет;
//вторая кнопка находится в фокусе, окно является модальным в пределах приложения
UINT nType = MB_ICONQUESTION | MB_YESNO | MB_DEFBUTTON2 ;
//отображение на экране окна сообщений и передача кода нажатой кнопки в объявленную переменную int anser = MessageBox ( Message , Title , nType ) ;
//если пользователь нажал кнопку Да,
//то вызывается функцию OnOK родительского класса CDialog, которая закрывает приложение
if ( anser = = IDYES ) CDialog :: OnOK ( ) ;
}
Синтаксис функции AfxMessageBox
Отобразить окно сообщений можно также с помощью перегруженных глобальных функций AfxMessageBox, синтаксис которых имеет вид:
int AfxMessageBox ( LPCTSTR lpszText , UINT nType = MB_OK , UINT nIDHelp = 0 ) ;
int AFXAPI AfxMessageBox ( UINT nIDPrompt , UINT nType = MB_OK , UINT nIDHelp = (UINT) –1 ) ;
Параметры функции:
nIDPrompt идентификатор сообщения в строковой таблице;
nIDHelp идентификатор контекстно-зависимой справки. Если параметр равен нулю – контекстнозависимая справка отсутствует.
Функция AfxMessageBox, в отличие от функции MessageBox,
всегда отображает в качестве заголовка окна сообщений название приложения; позволяет отображать в окне сообщений кнопку помощи, если в приложении создан файл справки; позволяет использовать идентификатор сообщения из строковой таблицы.
Последняя особенность может оказать существенное влияние на работу приложения. Строковая таблица является ресурсом. Как и всякий ресурс, данные из таблицы загружаются в оперативную память с жёсткого диска только по мере необходимости. Приложение, которое поддерживает большой набор функций, как правило, выводит на экран сотни и тысячи различных сообщений, каждое из которых содержит сотни символов. Таким образом, использование функции AfxMessageBox совместно со строковой таблицей уменьшает размер необходимой для приложения оперативной памяти на сотни килобайт.
Выжол Ю.А. |
Программирование на Visual C++ |
Лекция 9 |
Окно сообщений |
4 |
Использование строковой таблицы
Строковая таблица ( String Table ) создаётся в приложении мастером автоматически. Строковая таблица расположена в папке
String Table вкладки Resource View в окне проекта ( Workspace ).
В контекстном меню объекта String Table выберите команду Properties и установите русский язык.
Для отображения строковой таблицы дважды щёлкните по имени объекта в окне приложения. Строковая таблица показана на рисунке и содержит три столбца:
ID |
идентификатор строки является константой. Рекомендуется использовать пропис- |
|
ные латинские буквы. Для идентификатора строки рекомендуется использовать |
|
префикс IDS_; |
Value |
значение константы, инициализируется мастером; |
Caption |
строка, которая соответствует идентификатору строки. |
Для добавления новой строки откройте контекстное меню строковой таблицы и выберите команду New String. В диалоговом окне String Properties введите идентификатор строки и её значение.
Для изменения строки её нужно выделить и выбрать в контекстном меню команду Properties. Контекстное меню позволяет также вырезать, копировать и вставлять строки.
Приведённая выше задача может быть решена с помощью функции AfxMessageBox и строковой таблицы следующим образом:
void CMessageDlg :: OnExit ( )
{
UINT nType = MB_ICONQUESTION | MB_YESNO | MB_DEFBUTTON2 ; if ( IDYES = = AfxMessageBox ( IDS_EXIT , nType ) ) CDialog :: OnOK ( ) ;
}
Выжол Ю.А. |
Программирование на Visual C++ |