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

 

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

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

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

Примечание
Если в функцию UpdateAllviews передан параметр 0, то все окна представлений будут перерисованы. В программе MiniDraw не может быть больше двух окон представления. При включении двух (горизонтальной и вертикальной) вешек разбивки программа с однодоку-ментным (однооконным) интерфейсом может иметь до четырех представлений данного документа. Как будет показано в гл. 17, программа с многодокументным (многооконным) интерфейсом может иметь больше четырех представлений.
Совет
При разделении окна программы MiniDraw оба объекта представления отображают рисунок одинаково. В некоторых случаях данные документа в панелях могут отображаться по-разному. Например, в текстовом процессоре одно представление может отображать текст документа, а другое - его структуру. Дополнительная информация об этом содержится в следующих разделах справочной системы: Visual С++ Documentation, Using Visual С++, Visual С++ Programmees Guide, Adding User Interface Features, Details, Document/View Architecture Topics, Multiple Document Types, Views and Frame Windows.
Эффективная перерисовка
Если в одной панели была нарисована линия, то другую панель нужно полностью перерисовать, включая даже те части рисунка, которые в данный момент не видны. Изменим программу MiniDraw так, чтобы при рисовании линии в одной панели вторая перерисовывала только измененную и видимую часть рисунка.
Добавьте в определение класса CLine функцию GetDimRect, возвращающую размеры прямоугольника, который ограничивает нарисованную линию. Этот прямоугольник — часть окна, измененная при рисовании линии. Добавьте объявление функции в раздел public определения класса CLine в файле MiniDrawDoc.h.
class CLine : public CObject {
// объявления раздела protected ... public :
CLine fini XI, int Yl, int X2, int Y2)
{
m XI = XI
m ~Y1 = Yl
m ~X2 = X2
m ~Y2 = Y2
}
void Draw (CDC *PDC); CRect GetDimRect ();
virtual void Serialize (CArchives ar);
>
В конце файла MiniDrawDoc.cpp добавьте определение функции.
CRect CLine::GetDimRect () {
return CRect
(min (m_Xl, m_X2), min (m_Yl, m_Y2), max (m_Xl, m_X2) + 1, max (m_Yl, m_Y2) + 1);
}
Функция GetDimRect возвращает объект класса CRect с размерами ограничивающего прямоугольника. Макрокоманды min и max (определенные в файле
Windows.h) используются для проверки его сторон (координата левой стороны по горизонтали должна быть меньше правой, координата нижней стороны по вертикали - меньше верхней; в противном случае прямоугольник интерпретируется как пустой).
Измените функцию AddLine класса документа таким образом, чтобы она возвращала указатель на объект класса CLine, хранящий новую линию. В файле MiniDrawDoc.h измените объявление функции AddLine в разделе public класса CMiniDrawDoc.
CLine *AddLine (int XI, int Yl, int X2, int Y2);
Измените определение функции AddLine в файле MiniDrawDoc.cpp следующим образом:
CLine *GMiniDrawDoc::AddLine (int XI, int Yl, int X2, int Y2)
{
CLine *PLine = new CLine (XI, Yl, X2, Y2) ; m_LineArray.Add (PLine); SetModifiedFlag (); return PLine;
}
Измените вызовы функций AddLine и UpdateAllviews в функции OnLButtonUp файла MiniDrawView.cpp:
void CMiniDrawView::OnLButtonUp(UINT nFlags, CPoint point) {
// TODO: Здесь добавьте собственный код обработчика // и/или вызов стандартного обработчика
if (m_Dragging) {
m_Dragging = 0;
::ReleaseCapture ();
::ClipCursor (NULL);
CClientDC ClientDC (this); OnPrepareDC (SClientDC); ClientDC.DPtoLP (Spoint);
ClientDC.SetROP2 (R2_NOT); ClientDC.MoveTo (m_PointOrigin); ClientDC . LineTo (m__Point01d) ; ClientDC. SetROP2 (R_2_COPYPEN) ; ClientDC.MoveTo (m_PointOrigin); ClientDC.LineTo (point);
CMiniDrawDoc* PDoc = GetDocument(); CLine *PCLine;
PCLine = PDoc->AddLine (m_PointOrigin.x, m_PointOrigin.у, point.x, point.y);
PDoc->UpdateAllViews (this, 0, PCLine);
CScrollView::OnLButtonUp(nFlags, point);
}
Добавленный код сохраняет указатель на объект класса CLine, возвращенный функцией AddLine, а затем передает его как третий параметр в функцию update-AllViews. Функция UpdateAllViews класса CDocument имеет следующий формат.
void UpdateAllViews (CView* pSender, LPARAM lHint = UL, CObject* pHint = NULL);
Второй и третий параметры необязательны, они передают информацию об изменениях (называемую рекомендацией), которые нужно внести в документ. Рассмотрим, как это может увеличить эффективность перерисовки окон представления.
Функция UpdateAllViews вызывает виртуальную функцию OnUpdate для каждого объекта представления, передавая ей значения двух рекомендуемых параметров (lHint и pHint). Функция OnUpdate класса CView игнорирует эти значения и повторно перерисовывает все окно представления. Для увеличения эффективности перерисовки необходимо переопределить функцию OnUpdate, тогда рекомендованная информация будет использоваться для перерисовки измененной области окна представления. Используйте мастер ClassWizard, чтобы сгенерировать объявление функции и ее минимальное определение. В диалоговом окне мастера откройте вкладку Message Map, выберите класс CMiniDrawView в списках Class Name и Object Ids, а затем задайте виртуальную функцию OnUpdate в списке Messages. Щелкните на кнопке Edit Code и введите следующие строки в определение функции в файле Mini DrawView.cpp.
Предыдущая << 1 .. 124 125 126 127 128 129 < 130 > 131 132 133 134 135 136 .. 204 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100