Студопедия

КАТЕГОРИИ:

АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Классы контекста дисплея CClientDC и CWindowDC 




Как Вы помните, в клиентскую область окна не входят рамка, заголовок и меню. Если Вы создадите объект CCIientDC, то получите контекст устройства, представляющий только эту область — рисовать за ее пределами невозможно. Точка (0,0) обычно связана с верхним левым углом клиентской области. Как Вы увидите далее, объект CView соответствует дочернему окну, содержащемуся внутри отдельного окна-рамки, вместе с панелью инструментов, панелью состояния и линейками прокрутки. Все эти окна не входят в клиентскую область окна представления. Если, например, вверху окна имеется пристыкованная панель инструментов, то (0,0) соответствует точке непосредственно под левым краем панели. В случае, когда Вы создаете объект CWindowDC, точка (0,0) соответствует левому верхнему краю неклиентской области окна. С помощью этого полнооконного контекста устройства Вы можете рисовать по рамке окна, в области заголовка окна и т. д. Не забывайте, что у окна представления нет неклиентской области, поэтому CWindowDC более подходит для окон-рамок, а не для окон представлений.

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

Важно своевременно уничтожать созданные Вами объекты CDC, когда работа с ними закончена. Microsoft Windows ограничивает число доступных контекстов устройства, и если не освободить контекст устройства Windows, небольшой участок памяти будет потерян до самого завершения программы. Чаще всего объект «контекст устройства» создается в обработчике сообщения, например, в OnLButtonDown. Проще всего гарантировать уничтожение объекта «контекст устройства» (и освобождение соответствующего контекста устройства Windows), создавая объект в стеке следующим образом:

void CMyView::OnLButtonDown(UINT nFlags, CPoint point)

{

CRect rect;

CClientDC dc(this); // создание dc в стеке

dc.GetClipBox(rect); // получение ограничивающего прямоугольника

// использование dc …

} // здесь dc автоматически освобождается

 

Обратите внимание: конструктор объекта CCIientDC принимает в качестве параметра this – указатель на окно, т.е. класс вид. (В любом методе экземпляра класса можно использовать идентификатор this – указатель на экземпляр класса, которому принадлежит метод.) Деструктор CCIientDC вызывается при возврате управления из функции. Вы можете также получить указатель на контекст устройства с помощью функции CWnd::GetDC(), как показано ниже, но в этом случае не забывайте вызывать ReleaseDC для освобождения контекста устройства:

void CMyView::OnLButtonDown(UINT nFlags, CPoint point)

{

CRect rect;

CDC* pDC = GetDC(); // указатель на внутренний CDC

pDC->GetClipBox(rect);// получение ограничивающего прямоугольника

// использование dc …

ReleaseDC(pDC);  // He забывайте!

}

Внимание! Нельзя удалять или освобождать CDC-объект, указатель на который передается функции OnDraw. Удалением этого объекта управляет каркас приложения. Как сказано в MSDN, функцию CWnd::ReleaseDC следует вызывать для каждого вызова GetWindowDC и GetDC.

 

 

Состояние контекста устройства

Вы уже знаете, что контекст устройства необходим для рисования. Когда Вы используете CDC-объект для рисования, например, эллипса, то полученное на экране (или на принтере) изображение зависит от текущего «состояния» контекста устройства. Состояние контекста включает в себя:

· связанные с контекстом объекты для рисования, такие как перья, кисти и шрифты;

· режим преобразования координат, определяющий масштаб элементов при их рисовании;

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

 

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

Класс CPaintDC

Класс CPaintDC нужен, только если Вы переопределили функцию OnPaint() для своего окна представления. Реализация OnPaint() по умолчанию вызывает OnDraw() с надлежащим образом настроенным контекстом устройства, но иногда Вам может потребоваться код рисования, специфичный для дисплея. Особенность CPaintDC состоит в том, что его конструктор и деструктор выполняют действия, специфичные для дисплея. Однако, получив указатель на CPaintDC, Вы можете использовать его совершенно так же, как и любой другой контекст устройства. Вот пример функции OnPaint, создающей объект CPaintDC:

void CMyView::OnPaint()

{

CPaintDC dc(this);

OnPrepareDC(&dc); // объясняется позднее

dc.TextOut(0, 0, "для дисплея, но не для принтера");

OnDraw(&dc); // действия, общие для дисплея и принтера

}

 

Объекты GDI

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

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

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

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

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

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

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

 










Последнее изменение этой страницы: 2018-04-12; просмотров: 384.

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