- •Лекция №4. Gdi – графический интерфейс устройства.
- •Контекст устройства
- •Отсеченный путь
- •Этот метод используется при обработке сообщения wm_paint. Контекст устройства получают вызовом функции BeginPaint, имеющей следующий прототип:
- •Пример: в центре рабочей области окна вывести текст.
- •Использование сообщения wm_paint
- •Функция ValidateRect
- •Пример 2.
- •Частные контексты устройства
- •Операции контекста устройства
- •Режимы отображения.
- •Отображаем картинку в окне:
Отсеченный путь
Подобно региону отсечения, отсеченный путь - это другой графический объект, который приложение может выбрать в контексте устройства. В отличие от региона отсечения, отсеченный путь всегда создается приложением, и он используется для того, чтобы отсечь одну или несколько неправильных форм. Например, приложение может использовать линии и кривые, которые формируют контуры символов в строке текста, чтобы определить отсеченный путь.
Чтобы создать отсеченный путь, сначала необходимо создать путь, который описывает требуемую неправильную форму. Пути создаются, путем вызова соответствующей функции рисования графического интерфейса устройства (GDI) после вызова функции BeginPath и перед вызовом функции EndPath. Эту совокупность функций называют группой пути (path bracket).
После того, как путь был создан, он может быть преобразован в отсеченный путь, при помощи вызова функции SelectClipPath, идентифицируя контекст устройства и задавая режим использования. Режим использования определяет, как система комбинирует новый отсеченный путь с исходным регионом отсечения контекста устройства.
Следующая таблица описывает режимы использования.
Режим |
Описание |
RGN_AND |
Отсеченный путь включает в себя пересечение (области перекрытия) региона отсечения контекста устройства и текущего пути. |
RGN_COPY |
Отсеченный путь - текущий путь. |
RGN_DIFF |
Отсеченный путь включает в себя регион отсечения контекста устройства с какой-либо пересекающимися частями текущего исключенного пути. |
RGN_OR |
Отсеченный путь включает в себя союз (объединенные области) региона отсечения контекста устройства и текущего пути. |
RGN_XOR |
Отсеченный путь включает в себя союз региона отсечения контекста устройства и текущего пути, но исключает пересечение. |
Контекст дисплея
Windows поддерживает три типа контекста дисплея – контекст класса, приватный контекст и общий контекст. Контекст класса и приватный контекст используются в приложениях, которые выводят на экран большое количество информации (настольные издательские системы, графические пакеты и т.д.). Все остальные приложения используют общий контекст. Контекст класса является устаревшим и поддерживается только для обеспечения совместимости с предыдущими версиями Windows. В приложениях рекомендуется использовать только приватный контекст.
Контексты устройств хранятся в КЭШе, управляемом системой. Хэндл общего контекста программа получает с помощью функций GetDC(), GetDCEx(), BeginPaint(). После того как программа отработает с дисплеем, она должна освободить контекст, вызвав функцию ReleaseDC() или EndPaint() (в случае если контекст был получен с помощью BeginPaint()). После того, как контекст дисплея освобождён, все изменения, внесённые в него программой, теряются.
Приватный контекст в отличие от общего сохраняет все изменения даже после того, как прикладная программа освободила его. Приватный контекст не хранится в КЭШе, поэтому программа может не освобождать его. Память для приватного контекста выделяется системой специально для данного приложения. Для работы с приватным контекстом необходимо при регистрации класса окна указать стиль CS_OWNDC. Система сама удаляет приватный контекст в том случае, когда удаляется окно.
При работе с контекстами хэндлы контекста устройства с помощью функции BeginPaint() необходимо получать только в случае обработки сообщения WM_PAINT. Во всех остальных случаях необходимо использовать функции GetDC() или GetDCEx().
Для получения дескриптора контекста дисплея можно использовать два метода: