Рисование в представлении
Почти все рисование в приложении происходит в функции-члене представления OnDraw
, которую необходимо переопределить в классе представления. (Исключение — рисование мыши, рассмотренное в Интерпретация входных данных пользователей через представление.) Переопределение OnDraw
:
Получает данные, вызывая предоставленные вами функции-члены документа.
Отображает данные путем вызова функций-членов объекта контекста устройства, в который передается платформа
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.