Алгоритмизации
Скачать 1.15 Mb.
|
ОконнаяпроцедураОконная процедура определяет, что выводится в рабочую область окна и как окну реагировать на пользовательский ввод. Оконной процедуре(WndProc) можно назначить любое имя. В программе может содержаться несколько оконных процедур. Оконная процедура всегда связана с определенным классом окна, который регистрируется функцией RegisterClassEx. Функция CreateWindowсоздает окно на основе определенного класса окна. На основе одного и того же класса можно создавать несколько окон. Оконная процедура определяется следующим образом: LRESULT CALLBACK WndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam); ее параметры идентичны первым четырем полям структуры MSG. ОбработкасообщенийКаждое получаемое окном сообщение идентифицируется номером, содержащемся в параметреiMsgоконной процедуры. Для определения того, какое сообщение получила оконная процедура и как его обрабатывать, обычно используют оператор switch. Если оконная процедура обрабатывает сообщение, то ее возвращаемым значением должен быть 0. Все сообщения, не обрабатываемые оконной процедурой, передаются функции DefWindowProc, результат которой должен быть возвращаемым значением оконной процедуры. Функция WndProc обрабатывает два сообщения WM_PAINT и WM_DESTROY, а функция DefWindowProcобрабатывает (по умолчанию) все сообщения, не обработанные оконной процедурой. СообщениеWM_PAINTСообщение WM_PAINT– передает программе, что часть или вся рабочая область окна недействительна (invalid) и ее следует перерисовать. При первом создании окна недействительна вся рабочая зона и сообщение WM_PAINTзаставляет оконную процедуру рисовать в рабочей области, что происходит также и при изменении размера окна. Приложение6 Обработка сообщения 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!» в центре рабочей области созданного окна. |