Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lutsik_Yu_A_Obektno_orientir_programmir_na_yaz.pdf
Скачиваний:
63
Добавлен:
11.05.2015
Размер:
4.33 Mб
Скачать

При этом сообщение WM_QUIT помещается в очередь сообщений программы. Как уже упоминалось, функция GetMessage возвращает ненулевое значение при любом сообщении, полученном из очереди сообщений за исключением WM_QUIT. Когда GetMessage получает сообщение WM_QUIT, функция воз- вращает 0. Это заставляет WinMain прервать цикл обработки сообщений и вый- ти в систему, закончив программу.

11.15. Обработка сообщений функцией DefWindowProc

При изменении размера рабочей области окна Windows вызывает окон-

менившего размер. Параметр iMsg равен WM_SIZE. ПараметрРwParam для со-

ную процедуру. Параметр hwnd оконной процедуры − это описатель окна, из-

общения WM_SIZE равен одной из величин SIZENORMAL, SIZEICONIC, SIZEFULLSCREEN, SIZEZOOMSHOW или SIZEZOOMHIDE (определяемых как числа от 0 до 4) и показывает, будет ли окно свернуто, развернуто или

скрыто (в результате развертывания другого окна). Параметр lParam определяет

 

И

новый размер окна. Новая ширина (16-разрядное значение) и новая высота (16-

разрядное значение) объединяются вместе в 32-разрядныйУпараметр lParam.

Иногда в результате обработки сообщения функцией DefWindowProc ге-

Г

 

нерируются другие сообщения. Например, при выборе Close из системного ме-

ню программы, используя клавиатуру или мышьБ, DefWindowProc обрабатывает эту информацию. Когда она определяет, что выбрана опция Close, то отправля-

ет сообщение WM_SYSCOMMANDкао онной процедуре. WndProc передает это сообщение DefWindowProc. DefWindowProc реагирует на него, отправляя сооб- щение WM_CLOSE оконной проц дуре. WndProc снова передает это сообщение

DefWindowProc. DefWindowProcер агирует на сообщение WM_CLOSE, вызывая функцию DestroyWindow. DestroyWindow заставляет Windows отправить сооб-

щение WM_DESTROY к нной процедуре. И наконец, WndProc реагирует на

это сообщен е, вызываятфункцию PostQuitMessage путем постановки сообще-

ния WM_QUIT в чередь сообщений. Это сообщение прерывает цикл обработ-

 

о

ки сообщен й в WinMain и программа заканчивается.

и

11.16. Синхронные и асинхронные сообщения

л

 

C нхронными сообщениями называются сообщения, которые Windows

Бпомещаетприбв очередь сообщений программы и которые извлекаются в цикле об- работки сообщений. Асинхронные сообщения передаются непосредственно ок- ну, вызове Windows соответствующей оконной процедуры.

Синхронными сообщения становятся в основном тогда, когда они явля- ются результатом пользовательского ввода путем нажатия клавиш (например WM_KEYDOWN и WM_KEYUP), это символы, введенные с клавиатуры (WM_CHAR), результат движения мыши (WM_MOUSEMOVE) и щелчков кнопки мыши (WM_LBOTTONDOWN). Кроме этого синхронные сообщения включают в себя сообщение от таймера (WM_TIMER), сообщение о необходи- мости плановой перерисовки (WM_PAINT) и сообщение о выходе из програм-

261

мы (WM_QUIT). Сообщения становятся асинхронными во всех остальных слу- чаях. Часто асинхронные сообщения являются результатом синхронных. На- пример, когда WinMain вызывает функцию CreateWindow, Windows создает ок-

но и для этого отправляет оконной процедуре асинхронное сообщение WM_CREATE. При вызове функции ShowWindow, Windows отправляет окон- ной процедуре асинхронные сообщения WM_SIZE и WM_SHOWWINDOW. Когда WinMain вызывает UpdateWindow, Windows отправляет оконной проце- дуре асинхронное сообщение WM_PAINT.

нужен:

 

а

hdc=GetDC(hwnd);

к

Б

[использование функций GDI]

 

ке

 

 

ReleaseDC(hwnd, hdc);

 

 

 

Цикл обработки сообщений и оконная процедура работают не параллель-

но. Когда оконная процедура обрабатывает сообщение, то это результат вызова

 

Р

11.17. Еще один метод получения описателя контекста устройства

Получить описатель контекста устройства для рисования вИрабочей об-

ласти при обработке отличных от WM_PAINT сообщений или в случае, если

У

 

необходим описатель контекста устройства для других целей, можно вызвав

функции DispatchMessage в WinMain. DispatchMessage не завершается до тех пор, пока оконная процедура не обработала сообщение.

функцию GetDC. Функция ReleaseDC уничтожает егоГ, если он больше не

В этом случае рисовать можно в любом месте рабочей области, а не толь- ко в недействительном прямоугольни . В отличие от BeginPaint, GetDC не де- лает действительными какие-либо недейс вительные зоны.

Как правило, функции GetDC и ReleaseDC используются при обработке

GDI для вывода текстовых строк. Выше была использована функция DrawText. Более популярной функцией является TextOut, имеющая формат

сообщений от клавиатуры или

 

манипулятора «мышь». Они позволяют об-

новлять рабочую область не

средс енно в ответ на пользовательский ввод

 

 

 

 

тв

информации с клавиатуры

 

с помощью мыши, при этом специально делать

 

 

 

по

 

недействительной часть окна для выдачи сообщений WM_PAINT.

 

 

ли

 

 

11.18. Р сованиелтекста

 

 

Для рисован я в рабочей области окна используются функции графиче-

 

б

 

 

 

 

ского интерфейса (GDI) устройства. В Windows имеется несколько функций

и

 

 

 

 

Б

 

 

 

 

 

TextOut(hdc, x, y, psString, iLength);

Функция TextOut выводит на экран строку символов. Параметр psString − это указатель на строку символов, а iLength − длина строки символов. Параметры x и y определяют начальную позицию строки символов в рабочей области.

11.19. Полосы прокрутки

Для того чтобы вставить в окно приложения вертикальную или горизон-

262

тальную полосу прокрутки, надо включить идентификатор WS_VSCROLL (вер- тикальная прокрутка) и WS_HSCROLLW (горизонтальная прокрутка) или оба сразу в описание стиля окна в инструкции CreateWindow.

По умолчанию устанавливается следующий диапазон полосы прокрутки: 0 (сверху или слева) и 100 (снизу или справа), но диапазон легко изменить:

SetScrollRange (hwnd, iBar, iMin, iMax, bRedraw);

Параметр iBar равен либо SB_VERT, либо SB_HORZ, iMin и iMax являются ми- нимальной и максимальной границами диапазона, а bRedraw устанавливается в TRUE для перерисовки Windows полосы прокрутки на основе вновь заданного диапазона. Положение бегунка дискретно. Например, полоса прокрутки с диа- пазоном от 0 до 4 имеет пять положений бегунка. Для установки нового поло-

жения бегунка внутри диапазона полосы прокрутки можно использовать функ-

цию SetScrollPos:

У

Р

SetScrollPos (hwnd, iBar, iPos, bRedraw);

 

Г

 

Параметр iPos − это новое положение бегунка, оно должноИбыть задано внутри

диапазона от iMin до iMax. Для получения текущего диапазона и положения

полосы прокрутки в Windows используются функции GetScrollRange и GetScrollPos.

Сообщения полос прокрутки. АсинхронныеБсообщения WM_VSCROLL

а мыши на полосе прокрутки вызываеткпоявление нескольких сообщений: одного

и WM_HSCROLL Windows посыл ет оконной процедуре тогда, когда на полосе прокрутки щелкают мышью или перет скивается бегунок. Каждое действие

WM_HSCROLL − числот, сообщающееаме о действии на полосе прокрутки. Его значе- ния соответствуютоиден ифика орам, начинающимся с SB_. Идентификаторы типа

при нажатии кнопки мыши и другого, огда ее отпускают.

Младшее слово пар тра wParam, сообщений WM_VSCROLL и

SB_LINEUP, SB PAGEUP, SB LINEDOWN или SB_PAGEDOWN соответствуют нажатию кноп мыши на полосе прокрутки, а SB_ENDSCROLL, соответствует отпусканию кнопки мыши. Если младшее слово параметра wParam равно

SB_THUMBTRACK ли SB_THUMBPOSITION, то старшее слово wParam опреде-

 

 

ки

ляет текущее по ожение полосы прокрутки и находится между минимальным и

ма симальнымлзначениями диапазона полосы прокрутки. Во всех других случаях

при ра оте с полосами прокрутки старшее слово wParam следует игнорировать.

 

б

 

Также можно игнорировать параметр lParam, обычно используемый для полос про-

крут , создаваемых в окнах диалога.

ки

 

Б

Упражнения для закрепления материала

 

1. Создайте простое приложение выводящее на экран окно, содержащее

надпись. Далее измените размеры окна и координату верхнего левого угла окна. 2. Добавьте в приложение, разработанное в п.1, полосы прокрутки.

3. Добавьте в приложение, разработанное в п.1, меню. Меню содержит несколько пунктов, при выборе которых в окно выводится соответствующая надпись.

263

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]