Окна сообщений
Назначение окон сообщений
Воспользуемся окном сообщений, чтобы исследовать адресное пространство программы
Функция MessageBox()
вид и поведение окна сообщения
Возможные пиктограммы окна сообщения
Допустимые спецификации формата для функции wsprintf() и их назначение
Рассмотрим некоторые особенности работы систем Windows
Заключение
210.50K
Category: softwaresoftware

Окна сообщений. Назначение окон сообщений

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() можно выводить по ходу программы значения
интересующих нас переменных, как это сделано в приведенном выше фрагменте, с
целью их сравнения и проверки.
English     Русский Rules