Similar presentations:
Окна сообщений. Назначение окон сообщений
1. Окна сообщений
2. Назначение окон сообщений
Окна сообщений являются важнейшим средством диалога системы и прикладнойпрограммы с пользователем.
• Как правило, окна сообщений выводятся системой при возникновении в
приложении каких-либо сбоев
• однако в прикладных программах окна сообщений чрезвычайно удобно
использовать для вывода содержательных данных
–
–
результатов вычислений,
информации о ходе выполнения программы и т. д.
Окна сообщений могут также использоваться для управления программой, хотя
это и не очень удобно.
Окно сообщения, выведенное системой при обнаружении сбоя приложения
3. Воспользуемся окном сообщений, чтобы исследовать адресное пространство программы
Выведем содержимое сегментных регистров команд, данных и стека, а также
смещение главной функции WinMain и одного из данных, например строки с именем
класса.
Для этого в какое-либо место функции WinMain, например перед регистрацией класса
окна, надо вставить следующий фрагмент:
char szText[80];
wsprintf(szText,"CS=%X, DS=%X, SS=%X\nWinMain=%X\nszClassName=%X",
_CS,_DS,_SS,WinMain,szClassName);
MessageBox(NULL,szText,"Из программы",MB_ICONINFORMATION);
Результатом выполнения этого фрагмента будет вывод на экран сообщения с таким
содержимым.
4. Функция MessageBox()
Функция MessageBox() позволяет создать и вывести на экран в требуемой точке программы
служебное окно с заданным текстом,
в текст можно включить:
–
–
текстовые строки
числовые данные (значения переменных).
• Прототип этой функции выглядит следующим образом:
int MessageBox(
HWND hWnd,
//Дескриптор родительского окна
LPCTSTR lpText,
//Выводимый текст
LPCTSTR lpCaption,
//Заголовок окна сообщения
UINT uType
//Стиль окна сообщения
);
Первый параметр идентифицирует окно, являющееся родительским для окна сообщения. В
большинстве случаев вместо дескриптора родительского окна на месте этого параметра можно
указать NULL.
Второй параметр представляет собой адрес строки с текстом, выводимым в окно, или саму эту
строку, заключенную в кавычки.
Третий параметр - адрес строки или сама строка с текстом заголовка окна сообщения.
четвертый параметр в функцию передается константа, определяющая вид и поведение окна
сообщения.
5. вид и поведение окна сообщения
С помощью этой константы задаются 3 элемента окна сообщения:– вид пиктограммы, характеризующей тип сообщения, - информационное,
предупреждающее и пр.;
– набор управляющих кнопок в окне и надписи на них;
– задание кнопки, выбранной по умолчанию (при наличии в окне нескольких кнопок).
• Кроме внешнего вида окна, последний параметр позволяет задать степень блокирования
остальных окон приложения и других задач при выводе на экран данного сообщения. Это
важно в тех случаях, когда окно сообщения сигнализирует о серьезных неисправностях в
приложении или всей системе в целом.
• Константы, относящиеся к разным элементам окна, могут объединяться с помощью
операции побитового ИЛИ (знак |).
• в статье MessageBox интерактивного справочника можно также найти константы, задающие
наборы управляющих кнопок.
• Например,
– при использовании константы МВ_ОК в окно сообщения выводится единственная
кнопка с надписью ОК.;
– константа MB_YESNO выводит две кнопки - "Да" и "Нет" и т. д.
6. Возможные пиктограммы окна сообщения
Символические константыЗначок
MB ICONASTERISK (или MB_ICONINFORMATION)
i
MB_ICONHAND(или MB_ICONSTOP)
!
MB_ICONEXCLAMATION
MB_ICONQUESTION
?
7.
Если текст, выводимый в окно сообщения, известен заранее, его можно просто включить в вызов
функции MessageBox() в качестве параметра,
• например:
MessageBox(NULL, "Вы забыли задать данные!", "Ошибка", MB_ICONSTOP);
Если, однако, требуется вывести значения каких-либо числовых переменных, сначала надо эти
значения преобразовать в символьную форму, для чего удобно использовать функцию wsprintf():
wsprintf(szText, "CS=%X, DS=%X,SS=%X\nWinMain=%X\nszClassName=%X", CS, _DS, _SS,
WinMain, szClassName);
первый параметр - адрес строки-приемника,
второй параметр - адрес строки-источника (или сама строка).
– В строке-источнике, кроме текста, могут присутствовать спецификации формата,
определяющие, по какому формату будут преобразовываться в символьные строки
следующие далее переменные.
– Число указанных переменных (в приведенным примере это обозначения регистров
процессора _CS, _DS и _SS, а также имен функции WinMain и строки szClassName) должно
быть равно числу спецификаций формата. Все спецификации формата начинаются со знака
процента (%);
8. Допустимые спецификации формата для функции wsprintf() и их назначение
СпецификацииПеременная
Представление при выводе
d или i
u
х
Х
S
с
Целое
Целое
Целое
Целое
Строка
Байт
Десятичное целое со знаком :
Десятичное целое без знака
Шестнадцатеричное целое строчными буквами
Шестнадцатеричное целое прописными буквами
Строка
Символ
В действительности спецификаций формата гораздо больше, например
li - длинное целое со знаком в десятичном представлении,
lu — длинное целое без знака в десятичном представлении
lX - длинное целое в шестнадцатеричном представлении, однако для 32-разрядных программ
целые числа имеют длину 32 бита, т.е. совпадают с длинными целыми, и эти спецификации
не имеют смысла.
9. Рассмотрим некоторые особенности работы систем Windows
Для любых 32-разрядных приложений селектор сегмента команд всегда равен
0х137,
Селектор совпадающих сегментов данных и стека — 0x13F.
32-разрядные приложения работают в модели плоской памяти, где базовые адреса
всех сегментов равны нулю, в результате чего виртуальные смещения объектов
программы совпадают с их линейными адресами.
Программа и данные расположены в 1-м гигабайте линейного адресного
пространства, хотя и разнесены в нем на значительное расстояние;
Главная процедура WinMain() находится в 5-м мегабайте,
Строка с данными - в 7-м
.
10. Заключение
Функция MessageBox() широко используется в прикладных программах для
вывода всякого рода служебных сообщений.
Можно ее использовать в другом качестве - как средство диагностики и отладки
разрабатываемых программ.
С помощью функции MessageBox() можно выводить по ходу программы значения
интересующих нас переменных, как это сделано в приведенном выше фрагменте, с
целью их сравнения и проверки.