Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
VC Лекции PDF / VC 09 Лек Окно сообщений.pdf
Скачиваний:
36
Добавлен:
15.02.2015
Размер:
302.24 Кб
Скачать

Лекция 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++