Окно Б, получив ответ (сообщение WM_USER+2), выводит на экран текст при помощи фрагмента кода, приведенного в листинге 2.3.
Листинг 2.3
case WMJJSER+2:
MessageBox(hWnd."Получен ответ\п от окна А "."ОКНО Б".MB_T0PM0ST); break; Выведенное на экран окно MessageBox() может оказаться заслоненным основным окном другого приложения. Чтобы оно обязательно было видимым, в последнем параметре указан флаг MBJT0PM0ST. Если несколько сообщений с таким флагом выводятся на экран практически одновременно, окно, выведенное последним, оказывается сверху. Таким образом, использование параметра MBJT0PM0ST позволяет зафиксировать последовательность вывода сообщений MessageBox().
В обоих случаях (при щелчке левой и правой кнопкой) в окне программы Б операторы отправки сообщения и вывода текста Послали сообщение окну А следуют непосредственно друг за другом. Но порядок обмена (см. рис. 2.2) существенно различается.
При щелчке левой кнопкой поочередно выводятся четыре показанных слева текстовых окна:
1. После вызова функции SendMessage() выполнение оконной процедуры окна Б приостанавливается.
2. Окно А получает переданное функцией SendMessage() сообщение.
3. Оконная процедура окна А отправляет ответ окну Б.
4. Операционная система, не ожидая завершения оконной процедуры окна Б, запускает ее заново, передавая сообщение WMJJSER+2. Здесь необходимо вспомнить понятие реентерабельности. Функция называется реентерабельной, если ее выполнение разрешено временно прервать и вызвать ту же функцию повторно. В отличие от рекурсии, где функция сама организует повторный вызов, реентерабельная функция может быть прервана в случайный момент времени и в случайной точке под влиянием внешних факторов.
Обмен сообщениями
5. Оконная процедура программы А завершается, и только после этого функция SendMessage() окна Б возвращает управление и текст Послали сообщение окну А появляется на экране уже после завершения обмена.
Текст заголовка этого окна формируется в программе при помощи фрагмента кода, который приведен в листинге 2.4.