Информационный сайт

 

Реклама
bulletinsite.net -> Книги на сайте -> Программисту -> Янг Майкл Дж. -> "Visual С++ 6. Полное руководство: В 2 т.(том1)" -> 131

Visual С++ 6. Полное руководство: В 2 т.(том1) - Янг Майкл Дж.

Янг Майкл Дж. Visual С++ 6. Полное руководство: В 2 т.(том1) — Бином, 2006. — 569 c.
Скачать (прямая ссылка): vicualcc2006t1.djvu
Предыдущая << 1 .. 125 126 127 128 129 130 < 131 > 132 133 134 135 136 137 .. 204 >> Следующая

void CMiniDrawView::OnUpdate (CView* pSender, LPARAM lHint, CObject* pHint) f
if (pHint != 0) {
CRect InvalidRect = ((CLine *)pHint)->GetDimRect () ;
CClientDC ClientDC (this);
OnPrepareDC (SClientDC);
ClientDC.LPtoDP (SlnvalidRect) ;
InvalidateRect (SlnvalidRect);
)
else
CScrollView::OnUpdate (pSender, lHint, pHint);
}
Если функция OnUpdate вызывается функцией UpdateAllViews, то параметр pHint содержит указатель на объект класса CLine. Однако функция OnUpdate также вызывается заданной по умолчанию функцией OninitialUpdate, которая получает управление непосредственно перед первым отображением рисунка в окне
}
представления. В этом случае параметр pHint устанавливается в 0. Поэтому вначале функция OnOpdate проверяет значение данного параметра.
Если параметр pHint содержит указатель на объект класса CLine (т.е. отличен от нуля), то функция OnUpdate выполняет следующее.
1. Вызывает функцию CLine: -. GetDimRect для получения прямоугольника, ограничивающего добавленную линию, и сохраняет его в объекте invalidRect класса CRect.
2. Создает объект контекста устройства ClientDC и вызывает функцию CScrollView: :OnPrepareDC, чтобы скорректировать объект для текущей позиции прокрутки рисунка.
3. Вызывает функцию CDC::LPtoDP для преобразования координат в объекте InvalidRect из логических в фактические.
4. Передает объект InvalidRect в функцию InvalidateRect класса CWnd, что делает указанную прямоугольную область недействительной (т.е. помечает ее как требующую перерисовки) и вызывает функцию OnDraw класса представления. Передаваемые в функцию InvalidateRect координаты — это координаты устройства. Обратите внимание: если координаты устройства, переданные в функцию InvalidateRect, не принадлежат области окна представления (например, одно окно представления в настоящее время не отображает часть рисунка, измененную в другом окне), часть окна представления не становится недействительной.
Примечание
Недействительная часть окна представления называется областью обновления. При вызове функции InvalidateRect недействительная прямоугольная область добавляется к текущей области обновления Когда окно представления получает непустую область обновления, то после обработки любых сообщений с более высоким приоритетом вызывается функция OnDraw, и область обновления становится пустой. Обратите внимание: область становится недействительной также вследствие ответа Windows на событие, требующее перерисовки некоторой части рисунка (например, передвинуто верхнее из перекрывающихся окон).
Если параметр pHint не содержит указатель на объект класса CLine (т.е. равен нулю), то функция OnUpdate вызывает свою стандартную реализацию, которая делает недействительным все окно представления и вызывает функцию OnDraw.
Функция OnDraw обновляет весь рисунок, даже если только часть его попадает в недействительную область окна представления. Перепишем функцию OnDraw так, чтобы перерисовать только область, ставшую недействительной.
/////////////////////////////////////////////////////////////// // Отображение окна класса CMiniDrawView
void CMiniDrawView::OnDraw(CDC* pDC) {
CMiniDrawDoc* pDoc = GetDocument(); ASSERT_VALID(pDOC);
// TODO: здесь добавьте код для отображения собственных // данных
CSize ScrollSize = GetTotalSize () ; pDC->MoveTo (ScrollSize.cx, 0); pDC->LineTo (ScrollSize.cx, ScrollSize.cy); pDC->LineTo (0, ScrollSize.cy) ; CRect ClipRect; CRect DimRect; CRect IntRect; CLine *PLine;
pDC->GetClipBox (uClipRect);
int Index = pDoc->GetNumLines (); while (Index--) {
PLine = pDoc- GetLine (Index); DimRect = PLine->GetDimRect () ; if (IntRect.IntersectRect (DimRect, ClipRect)) PLine->Draw (pDC); )
)
Теперь функция OnDraw вызывает метод CDC: :GetclipBox для получения размеров недействительной области и функцию GetDimRect для получения ограничивающего прямоугольника, после чего вызывается функция intersectRect, определяющая, попадает ли ограничивающий прямоугольник в область, признанную недействительной. Последняя функция возвращает значение true, если два переданных прямоугольника имеют непустое пересечение, т.е. перекрываются. Если ограничивающий линию прямоугольник лежит внутри недействительной области, то функция OnDraw рисует линию.
Примечание
Часть рисунка, не попавшая в недействительную область окна представления, при перерисовке отсекается, т.е. игнорируется. В программе MiniDraw можно просто вызвать функцию для перерисовки всех линий (на скорости рисования это не отразится). Однако полнофункциональная программа рисования или программа автоматизированного проектирования обычно строит намного более сложные рисунки, поэтому в подобных программах перерисовка фигур, которые находятся в недействительной области, весьма эффективна.
Подытожим работу добавленного в этом разделе фрагмента программы. При рисовании линии в одном окне представления вызывается функция UpdateAllViews объекта документа, которой передается указатель на объект класса CLine, содержащий новую линию. Затем для другого представления вызывается функция OnUpdate, которой передается указатель на объект класса CLine. Функция OnUpdate делает недействительной часть окна представления, ограничивающую новую линию, что приводит к вызову функции OnDraw. Последняя
Предыдущая << 1 .. 125 126 127 128 129 130 < 131 > 132 133 134 135 136 137 .. 204 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100