Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
шпоры по Леонову, 5семестр.doc
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
503.3 Кб
Скачать

24.Объекты gdi

Каждый тип объектов GDI Windows представлен отдельным классом MFC. CGdiObject абст­рактный базовый класс для классов объектов GDI. Объект GDI представляется С++-объектом некоторого класса, производного от CGdiObject. Вот эти классы:

CBitmap — Растровое изображение (bitmap) — массив битов, в котором каждой точке дисплея соответствует один или несколько битов. Растровые изображения можно исполь­зовать для хранения картинок, а также для создания кистей.

CBrush — Кисть (brush) — точечный шаблон, используемый для закраски областей.

CFont — Шрифт (font) — полный набор символов некоторой гарнитуры и некоторого размера. Обычно шрифты хранятся на диске как ресурсы, причем некоторые шрифты специфичны для определенных устройств.

CPalette — Палитра (palette) — интерфейс преобразования цветов, позволяющий при­ложениям в полной мере использовать цветовые возможности устройства вывода, не ме­шая другим приложениям.

СРеп — Перо (pen) — инструмент для рисования линий и границ фигур. Вы можете за­дать цвет и толщину пера, а также указать, будут ли линии сплошными, пунктирными или штриховыми.

CRgn — Регион (region) — область, которая представляет собой многоугольник, эллипс или их комбинацию. Регионы можно использовать для закраски, обрезания выводимого изоб­ражения и проверки на попадание курсора мыши на определенные участки.

Создание и уничтожение GDI-объектов

Вы еще ни разу не создавали объекты класса CGdiObject вместо этого Вы конструировали объекты производных классов. Конструкторы для некоторых классов, например, СРеп или CBrush, позволяют указывать достаточно информации, чтобы создать объект за одну опера­цию. Создание других объектов, например, CFont или CRgn, требует второй операции. Объекты этих классов создаются конструктором по умолчанию, после чего вызывается сответствую-щая функция, например, CreateFont или CreatePolygonRgn.

Класс CGdiObject содержит виртуальный деструктор. Деструкторы производных классов удаляют GDI-объекты, связанные с соответствующими С++-объектами. Если Вы создали объект класса, производного от CGdiObject, то обязаны удалить его до завершения программы. Для удаления GDI-объекта его следует сначала отделить от контекста устройства. Пример мы рассмотрим в следующем разделе.

ПРИМЕЧАНИЕ Завершение программы без удаления GDI-объекта в Win 16 несло серьезную опасность. ПаМять GDI не освобождалась до момента перезапуска Windows. В Win32 память GDI принадлежит процессу и освобождается при завершении программы. Тем не менее, GDI-объект, который Вы забыли освободить, может напрасно занимать значительный объем памяти.

Управление GDI-объектами

Итак, Вы знаете, что GDI-объекты нужно удалять, предварительно отсоединив от контекста устройства. Как же это сделать? Функции семейства CDC::SelectObject выбирают GDI-объект в контекст устройства и возвращают указатель на объект, который был выбран в контекст до этого (и теперь отсоединен). Но возникает проблема: нельзя отсоединить старый объект, не выбрав в контекст новый. Простое решение — «сохранить» первоначальный GDI-объект при выборе своего объекта в контекст и восстановить его по завершении работы. После этого Вы можете удалить свой GDI-объект. Пример приведен ниже:

void CMyView::OnDraw(CDC* pDC)

{СРеп newPen(PS_DASHDOT, 2, (COLORREF) 0); // черное перо шириной в 2 точки СРеп* pOldPen = pDC->SelectObject(&newPen);

pDC->MoveTo(10, 10);

pDC->LlneTo(110, 10);

pDC->SelectObject(pOldPen): // newPen отсоединяется } // newPen автоматически уничтожается при выходе

При уничтожении контекста устройства все его GDI-объекты отсоединяются. Таким обра­зом, если известно, что контекст устройства будет уничтожен до того, как будут уничтожены выбранные в него объекты, отсоединять эти объекты не нужно. Например, если Вы объявили перо как переменную-член класса «вид» (и инициализировали его при инициализации объек­та «вид»), то не надо отсоединять перо внутри OnDraw: контекст устройства, временем жиз­ни которого управляет обработчик OnPaint в базовом классе, будет уничтожен раньше.

Стандартные GDI-объекты

Windows предоставляет Вам ряд стандартных GDI-объектов (stock GDI objects). Так как эти объекты — часть Windows, заботиться об их удалении не нужно (Windows игнорирует зап­росы на удаление стандартных объектов). Функция библиотеки MFC CDC::SelectStockObject вы­бирает стандартный объект в контекст устройства и возвращает указатель на выбранный ранее объект, который отсоединяется от контекста. Стандартные объекты удобны, когда Вам нужно отсоединить свой собственный нестандартный GDI-объект перед его удалением. Стан­дартный объект можно применять вместо «старого» объекта, который использовался в пре­дыдущем примере':

void CMyView::OnDraw(CDC* pDC) {

CPen newPen(PS_DASHDOT, 2, (COLORREF) 0); // черное перо шириной в 2 точки

СРеп* pOldPen = pDC->SelectObject(&newPen);

pDC->MoveTo(10, 10);

pDC->LineTo(110, 10);

pDC->SelectStockObject(BLACK_PEN); // newPen отсоединяется } // newPen автоматически уничтожается при выходе

Стандартные перья, кисти, шрифты и палитры перечислены в описании функции CDC::Se­lectStockObject в руководстве Microsoft Foundation Class Reference.