Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
WinAPI.docx
Скачиваний:
49
Добавлен:
16.12.2018
Размер:
3.43 Mб
Скачать

3.2.1 Контекст устройства

Вспомните, описатель — это просто число, которое Windows использует для внутренней ссылки на объект. Вы получаете описатель от Windows и затем используете этот описатель в разных функциях. Описатель контекста устройства — это паспорт вашего окна для функций GDI. Этот описатель дает вам полную свободу при рисовании в рабочей области вашего окна, и вы можете сделать ее такой, как пожелаете.

Контекст устройства фактически является структурой данных, которая внутренне поддерживается GDI. Контекст устройства связан с конкретным устройством вывода информации, таким как принтер, плоттер или дисплей. Что касается дисплея, то в данном случае контекст устройства обычно связан с конкретным окном на экране.

Некоторые значения в контексте устройства являются графическими "атрибутами" (attributes). Эти атрибуты определяют некоторые особенности работы функций рисования GDI. Например, для функции TextOut эти атрибуты контекста устройства задают цвет текста, цвет фона для текста, процедуру преобразования координат x и y, передаваемых функции TextOut в координаты рабочей области, а также шрифт, используемый для вывода текста.

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

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

3.2.2 Получение описателя контекста устройства. Первый метод

Этот метод используется при обработке сообщений WM_PAINT. Применяются две функции: BeginPaint и EndPaint. Для этих двух функций требуется описатель окна (передаваемый в оконную процедуру в качестве параметра) и адрес переменной типа структуры PAINTSTRUCT. Программисты, пишущие программы для Windows, обычно называют эту структурную переменную ps и определяют ее внутри оконной процедуры следующим образом:

PAINTSTRUCT ps;

Во время обработки сообщения WM_PAINT оконная процедура сначала вызывает BeginPaint для заполнения полей структуры ps. Возвращаемым значением функции BeginPaint является описатель контекста устройства. Обычно он передается переменной с именем hdc. Эта переменная определяется в оконной процедуре следующим образом:

HDC hdc;

Тип данных HDC определяется как 32-разрядное беззнаковое целое. Затем программа может использовать функции GDI, например TextOut. Вызов функции EndPaint освобождает описатель контекста устройства.

Типовой процесс обработки сообщения WM_PAINT выглядит следующим образом:

case WM_PAINT:

hdc=BeginPaint(hwnd, &ps);

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

EndPaint(hwnd, &ps);

return 0;

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

DefWindowProc обрабатывает сообщения WM_PAINT следующим образом:

case WM_PAINT:

BeginPaint(hwnd, &ps);

EndPaint(hwnd, &ps);

return 0;

Следующие одна за другой функции BeginPaint и EndPaint просто превращают ранее недействительный регион в действительный. Но нельзя делать следующее:

case WM_PAINT:

return 0; // ОШИБКА!!!

Windows помещает сообщение WM_PAINT в очередь сообщений, поскольку часть рабочей области окна недействительна (требует перерисовки). До тех пор пока вы не вызовете функции BeginPaint и EndPaint (или ValidateRect), Windows не сделает эту область действительной. Вместо этого Windows снова отправит вам сообщение WM_PAINT. И снова, и снова, и снова ...

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