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

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.