Поделиться через


Рисование в представлении

Почти все рисование в приложении происходит в функции-члене представления OnDraw , которую необходимо переопределить в классе представления. (Исключение — рисование мыши, рассмотренное в Интерпретация входных данных пользователей через представление.) Переопределение OnDraw :

  1. Получает данные, вызывая предоставленные вами функции-члены документа.

  2. Отображает данные путем вызова функций-членов объекта контекста устройства, в который передается платформа OnDraw.

Когда данные документа изменяются каким-то образом, представление должно быть перезабрано, чтобы отразить изменения. Как правило, это происходит, когда пользователь вносит изменения в представление документа. В этом случае представление вызывает функцию-член UpdateAllViews документа, чтобы уведомить все представления о том же документе, чтобы обновить себя. UpdateAllViewsвызывает функцию-член onUpdate каждого представления. Реализация по умолчанию OnUpdate недействительна для всей клиентской области представления. Его можно переопределить, чтобы сделать недействительными только те регионы клиентской области, которые сопоставляют с измененными частями документа.

Функция-член UpdateAllViews класса CDocument и OnUpdate функция-член класса CView позволяют передавать сведения, описывающие, какие части документа были изменены. Этот механизм "подсказки" позволяет ограничить область, которую представление должно перераскрыть. OnUpdate принимает два аргумента подсказки. Первый, lHint типа LPARAM, позволяет передавать любые данные, которые вы хотите, в то время как второй, pHint типа CObject*, позволяет передавать указатель на любой объект, производный отCObject.

Когда представление становится недействительным , Windows отправляет его WM_PAINT сообщение. Функция обработчика OnPaint представления реагирует на сообщение путем создания объекта контекста устройства класса CPaintDC и вызывает функцию члена представления OnDraw . Обычно не требуется писать переопределяющую OnPaint функцию обработчика.

Контекст устройства — это структура данных Windows, содержащая сведения о атрибутах рисования устройства, таких как дисплей или принтер. Все вызовы рисования выполняются через объект контекста устройства. Для рисования на экране OnDraw передается CPaintDC объект. Для рисования на принтере передается объект CDC, настроенный для текущего принтера.

Код для рисования в представлении сначала извлекает указатель на документ, а затем выполняет вызовы рисования через контекст устройства. Следующий простой OnDraw пример иллюстрирует процесс:

void CMyView::OnDraw(CDC* pDC)
{
   CMyDoc* pDoc = GetDocument();
   ASSERT_VALID(pDoc);
   if (!pDoc)
      return;

   CString s = pDoc->GetData();   // Returns a CString
   CRect rect;
   GetClientRect(&rect);

   pDC->SetTextAlign(TA_BASELINE | TA_CENTER);
   pDC->TextOut(rect.right / 2, rect.bottom / 2, s, s.GetLength());
}

В этом примере вы определите функцию GetData как член производного класса документов.

В примере выводится какая-либо строка, полученная из документа, по центру в представлении. OnDraw Если вызов предназначен для рисования экрана, объект, переданный в pDC, CDC является конструкторомCPaintDC, который уже вызвалBeginPaint. Вызовы функций рисования выполняются с помощью указателя контекста устройства. Сведения о контекстах устройства и вызовах рисования см. в разделе "Справочник по MFC" и "Работа с объектами окон".

Дополнительные примеры записи OnDrawсм. в примерах MFC.

См. также

Использование представлений