Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
VC_Lect.doc
Скачиваний:
6
Добавлен:
01.07.2025
Размер:
15 Мб
Скачать
☆

8.1.Классы контекста дисплея cClientDc и cWindowDc

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

8.2.Создание и уничтожение 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.

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

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

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

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

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

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]