Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Конспект лекций Часть II.doc
Скачиваний:
14
Добавлен:
20.11.2018
Размер:
1.48 Mб
Скачать

П 3. Вывод в окно

Вывод в окна обладает рядом особенностей.

1. Нельзя пользоваться функциями вывода библиотеки компилятора, поскольку они приспособлены для вывода в одно и единственное окно. В операционной системе Windows приложения выводят одновременно в различные окна. Система сама решает все проблемы, связанные с воз­можным перекрытием или перемещением этих окон. С этим обстоятель­ством связано то, что в окно стремятся выводить в одном месте при­ложения - при обработке сообщения WM_PAINT. Приложение опи­сывают таким образом, чтобы при поступлении сообщения WM_PAINT функция окна могла перерисовать в окно или любую его заданную часть.

2. Интерфейс графических устройств (Graphics Device Interface -GDI) системы открывает доступ к большому количеству функций вы­вода. Приложения, обращаясь к функциям GDI, работают не с физиче­скими устройствами вывода, а с логическими. То есть описание вызова функций независит от физического способа отображения. GDI передает указания о выводе драйверу устройства вывода. Драйвер работает непо­средственно с физическим устройством и при управлении выводом учи­тывает его ограниченные возможности и аппаратные особенности. Бла­годаря этому приложения способны работать с любым устройством вывода, драйвер которого установлен в системе. В этой главе рассмат­риваются функции и параметры вывода в окно на экране видеомонитора. Но не все физические устройства вывода способны поддерживать те ре­жимы, в которых работает видеомонитор. Поэтому, описывая последо­вательность операций вывода, например на принтер, следует учитывать ограниченные возможности установленного принтера.

3. Параметры вывода устанавливают в контексте отображения с помощью функций GDI. Контекст отображения - это структура данных, которая содержит характеристики устройства вывода и указатели на вы­бранные инструменты рисования. Функции GDI используют только вы­бранные в контекст отображения параметры и инструменты рисования. Например, для рисования линии некоторой толщины в контекст отобра­жения приложение должно выбрать перо этой толщины.

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

П. 3.1. Виды контекста отображения

Существуют следующие виды контекста отображения:

• общий;

• для класса окон;

• личный;

• родительский;

• для окна.

Способы получения и освобождения контекста отображения зависят от вида контекста. Каждый контекст имеет свои особенности и назначение.

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

Этот контекст отличает высшая скорость доступа к нему. Для полу­чения общего контекста вызывают функцию BeginPaint (при обработке сообщения WM_PAINT) или GetDC (для рисования при обработке дру­гих сообщений). Стиль класса окна с общим контекстом отображения не может содержать значения CS_OWNDC, CS_PARENTDC или CS_ CLASSDC.

Функция GetDC возвращает контекст отображения для рабочей об­ласти окна hwnd:

HDCGetDC(HWNDhwnd);

Параметры возвращаемого контекста зависят от стиля класса указан­ного окна. Для общего контекста функция GetDC устанавливает задан­ные по умолчанию атрибуты. А параметры контекста отображения клас­са окон или личного контекста отображения функция GetDC оставляет неизменными. Если hwnd=NULL, то возвращается контекст видеомо­нитора с началом координат в левом верхнем углу экрана. В последнем случае допускается вывод в любом месте экрана.

В случае ошибок функция GetDC возвращает NULL.-

Эту функцию вызывают, если требуется вывод в окно во время обра­ботки других сообщений, не посылая сообщения WM_PAINT.

Для освобождения общего контекста отображения, полученного функцией GetDC, вызывают функцию ReleaseDC. Контекст отображения для класса окон и личный контекст отображения освобождать не обяза­тельно. Функция ReleaseDC освобождает только общий контекст ото­бражения или контекст отображения для окна:

int ReleaseDC( HWND hwnd, HOC hdc);

Здесь hwnd - дескриптор, окна, чей контекст должен быть освобожден, а hdc - освобождаемый контекст отображения.

Если контекст освобожден, возвращаемое значение 1, иначе - нуль.

Приложения вызывают функцию ReleaseDC для каждого вызова функции GetWindowDC и для каждого вызова функции GetDC.

Внимаение! Еще раз обращаем ваше внимание на необходимость своевре­менного освобождения общего контекста отображения.

Контекст отображения для класса окон

Можно создать единственный контекст отображения для всех окон | некоторого класса. Для этого при регистрации класса указывают стиль ] CS_CLASSDC. Тогда все окна этого класса будут пользоваться одним | общим контекстом отображения.

Приложения, однажды получив контекст отображения для класса окон, могут не освобождать его. Причем вызов функций EndPaint и ReleaseDC не освобождает такой контекст (хотя и не вредит работе при­ложения). Для сохранения единого стиля работы с контекстами реко­мендуется всегда вызывать эти функции.

Контекст отображения для класса окон создают один раз. Если создано несколько окон этого класса, область ограничения и начало системы физиче­ских координат вывода автоматически настраиваются на то окно, которое использует контекст отображения. Но если на базе класса стиля CS_CLASSDC приложение создало только одно окно, оно может получить контекст отображения дня класса окон один раз и не освобождать его.

Таким образом, контекст отображения для класса окон повышает производительность вывода в окна тем, что не требует настройку много­численных атрибутов контекста отображения после каждого вызова функции BeginPaint или EndPaint.

Личный контекст отображения

Этим контекстом обладают окна класса со стилем CS_OWNDC. Лич­ный контекст получают один раз и настраивают его атрибуты, а освобо­ждают только ,при завершении работы приложения. Функции BeginPaint, EndPaint, GetDC и ReleaseDC не влияют на личный контекст. Личный контекст экономит расход оперативной памяти.

Родительский контекст отображения

Этот контекст используют дочерние окна. Он позволяет дочерним окнам "унаследовать" атрибуты контекста отображения у родительского окна. Например, дочернее окно может использовать для вывода текста тот же шрифт и цвета, что и родительское окно.

С этой целью в стиле класса дочерних окон указывают значение CSJ»ARENTDC.

Контекст отображения для окна

Описанные выше контексты позволяют рисовать только в рабочей области окна. Контекст отображения дня окна позволяет рисовать в лю­бом месте окна- в области заголовка, системного меню, рамок, кнопок изменения размера окна и т. п.

Контекст отображения для окна получают с помощью функции GetWindowDC. Далее он используется аналогично общему контексту отображения. При этом начало системы координат находится в левом верхнем углу окна, а не рабочей области. Прототип функции подобен прототипу функции GetDC:

HOC GetWindowOC( HWND hwnd);

Для освобождения контекста отображения для окна вызывают функ­цию ReleaseDC.

Для вывода в различные части окна нужно предварительно опреде­лить метрики окна с помощью функции GetSystemMetrics.