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

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

Каждое получаемое окном сообщение идентифицируется номером, содержащемся в параметре iMsgоконной процедуры.

Для определения того, какое сообщение получила оконная процедура и как его обрабатывать, обычно используют оператор switch. Если оконная процедура обрабатывает сообщение, то ее возвращаемым значением должен быть 0. Все сообщения, не обрабатываемые оконной процедурой, передаются функцииDefWindowProc, результат которой должен быть возвращаемым значением оконной процедуры.

Функция WndProcобрабатывает два сообщенияWM_PAINTиWM_DESTROY, а функцияDefWindowProc обрабатывает (по умолчанию) все сообщения, не обработанные оконной процедурой.

Сообщение wm_paint

Сообщение WM_PAINT– передает программе, что часть или вся рабочая область окна недействительна (invalid) и ее следует перерисовать.

При первом создании окна недействительна вся рабочая зона и сообщение WM_PAINTзаставляет оконную процедуру рисовать в рабочей области, что происходит также и при изменении размера окна.

Обработка сообщения WM_PAINTпочти всегда начинается вызовом:

hdc=BeginPaint (hwnd, &ps);

и заканчивается функцией

EndPaint(hwnd, &ps);

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

При обработке вызова BeginPaintобновляется фон рабочей области, заданной кистью; вся рабочая область становится действительной и возвращаетсяописатель контекста устройства, описывающий физическое устройство вывода информации (дисплей) и его драйвер.

Функция EndPaintосвобождает описатель контекста устройства, после чего его значение нельзя использовать.

Для определения размера рабочей области окна вызывается функция

GetClientRect (hwnd, &rect);

параметр rect– структура типаRECT(rectangle– прямоугольник), содержащая четыре поля типаLONG(leftлевое, topверх, rightправое, bottomниз), в которые помещаются размеры рабочей области окна; поляleft, topвсегда устанавливаются в 0, поляright,bottom– ширина и высота рабочей области в пикселях.

Структура rectиспользуется в качестве четвертого параметра функции отображения текста:

DrawText(hdc, "Hello, Windows !", –1, &rect,

DT_SINGLELINE | DT_CENTER | DT_VCENTER);

второй параметр – отображаемый текст; третий параметр (–1) указывает, что строка текста заканчивается нулевым символом; последний параметр – набор флагов, значения которых указывают, что текст следует выводить в одну строку, по центру прямоугольной области размером, заданным в rect. Вызов этой функции отображает строку «Hello, Windows!» в центре рабочей области созданного окна.

Сообщение wm_destroy

Пользователь вызывает это сообщение, если щелкнет кнопку закрытия окна (выберет Closeиз системного меню программы, или нажмет <Alt> + <F4>).

Программа на это сообщение вызывает функцию

PostQuitMessage(0);

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