Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
шпоры печатать.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
379.36 Кб
Скачать

111. Разработка приложений Win32. Отображение и перерисовка окна. Цикл обработки

сообщений. Функция GetMessage(). Функция TranslateMessage(). Функция DispatchMessage().

Отображение и перерисовка окна

Чтобы окно появилось на экране, недостаточно лишь зарегистрировать класс и создать окно этого класса. После всего этого необходимо еще обратиться к функции ShowWindowO:

ShowWindow(hWnd,nCmdShow);

Второй параметр, nCmdShow, определяет способ отображения окна. Значение nCmdShow может указать, что окно должно отображаться в обычном виде (SW_SHOWNORMAL), но есть и еще несколько возможностей. Например, задав в качестве nCmdShow константу SW_SHOWMINNOACTTVE, определенную в WINDOWS.H, можно заставить Windows отобразить окно в виде значка:

ShowWindow(hWnd,SW_SHOWMINNOACTIVE) ;

Остальные варианты включают SW_SHOWMAXIMIZED, что приводит к активизации окна и развертыванию на весь экран, и противоположность этому, SW_SHOWMINIMIZED.

Последним шагом в изображении окна должен быть вызов функции UpdateWmdow():

UpdateWindow(hWnd);

Когда вызывается ShowWindow() с параметром SW_SHOWNORMAL, рабочая область окна очищается при помощи фоновой кисти. (Вспомним, что в данном приложении для этого используется кисть WHITE_BRUSH.) Вызов UpdateWindow() заставляет перерисовать рабочую область, посылая сообщение WM_PAINT.

Цикл обработки сообщений

Когда окно приложения создано и отображено на экране, программа готова приступить к своей главной задаче — обработке сообщений. Напомним. что Windows не направляет сигналы от клавиатуры или мыши прямо в приложение. Вместо этого Windows помещает сообщения в очередь приложения. В эту очередь могут попасть сообщения, посланные Windows или другими приложениями. Как только функция WinMain() создала окно и вывела его на экран, необходимо создать цикл обработки сообщений (message loop). Этот цикл обычно организуется при помощи ключевого слова while:

while (GetMessage(&msg,0,0,0)) {

TranslateMessage(&msg) ;

DispatchMessage(&msg);

}

Функция GetMessage()

Эта функция предназначена для получения следующего сообщения из очереди приложения, копирования его в структуру msg и передачи в основную программу. Три нулевых аргумента указывают, что следует принимать любые сообщения.

Windows З.х является системой с невытесняющей многозадачностью (nonpreemptive multitasking system), то есть она не может отобрать управление у приложения. Приложение должно само вернуть управление системе, и только тогда Windows сможет передать управление другой программе. В этой системе функция GetMessage() может автоматически передать управление другим, если у данного приложения нет сообщений в очереди. Когда в очередь вновь поступит сообщение, приложение возобновит работу в точке, непосредственно следующей за обращением к GetMessage().

ПРИМЕЧАНИЕ. И Windows 95, и Windows NT являются системами с вытесняющей многозадачностью (preemptive multitasking systems). Они могут полностью распоряжаться приложениями, запущенными под их управлением.

Приложение вполне может вернуть управление Windows и до входа в цикл обработки сообщений.

Функция TranslateMessage()

Функция TranslateMessage() необходима только в тех программах, которые обрабатывают ввод с клавиатуры. Возможность обрабатывать нажатия клавиш очень полезна, поскольку дает возможность пользователю делать выбор из меню без помощи мыши. При поступлении сообщений WM_KEYDOWN и WM_KEYUP функция TranslateMessage() создает сообщение WM_CHAR, содержащее информацию об ASCII коде нажатой клавиши. Если в цикле обработки сообщений есть обращение к этой функции, программа может пользоваться интерфейсом клавиатуры.

Функция DispatchMossage()

Функция DispatchMessage() производит доставку сообщения нужной функции окна. Используя эту функцию, можно легко добавлять в приложение новые окна и диалоги, поскольку DispatchMessage() автоматически будет распределять приходящие сообщения по соответствующим функциям окна.