Рисование в представлении
Почти все изображение в приложении происходит в функции-члене OnDraw представления, которые необходимо переопределить по в представлении класс. (Исключение рисование мышь, обсуженное в Интерпретация введенные пользователем данные через представление). Переопределенный OnDraw:
Получает данные путем вызова функции-члены документа предоставляется.
Отображает данные путем вызова функции-члены объекта контекста устройства, что платформа передаче OnDraw.
Если данные документа изменяется каким-либо образом, представление следует перерисовать для отражения изменений. Обычно это происходит, когда пользователь вносит изменения через представление в документе. В этом случае представление функции-члена UpdateAllViews документа, чтобы уведомить всех представления в одном документе для обновления. UpdateAllViews функции-члена OnUpdate каждого представления. Реализация по умолчанию OnUpdate что всю клиентскую область представления. Можно переопределить, чтобы сделать только те области клиентской области, которые сопоставляют измененных части документа.
Функция-член UpdateAllViews класса CDocument, а функция-член OnUpdate класса CView позволяют передавать сведения, какие части документа было изменено. Этот механизм «подсказки» позволяет ограничить область, представление должно redraw. OnUpdate принимает 2 аргумента «подсказки». Во-первых, lHint, тип LPARAM, позволяет передавать любые данные, чтобы позже, а второй, pHint, типа CObject*, позволяет передавать указатель на любой объект, производный от CObject.
Если представление будет недопустимым Windows, он отправляет сообщение WM_PAINT. Функции обработчика OnPaint представления отвечает на сообщение путем создания объекта контекста устройства класса CPaintDC и вызывает функцию-член OnDraw данного представления. Обычно писать при переопределении функции обработчика OnPaint.
контекст устройства — это структура данных Windows, которая содержит сведения об атрибутах рисования устройствах, таких как отображение или принтер. Все выполненные рисования с помощью объекта контекста устройства. Для рисования на экране OnDraw передается объект CPaintDC. Для рисования на принтер он передается объектом CDC настроено для текущего принтера.
Код для рисования в представлении сначала получает указатель на объект document, затем осуществляет рисования через контекст устройства. В следующем примере 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 для рисования экрана, объект CDC, в pDCCPaintDC конструктор которого уже, BeginPaint. К функциям рисования выполненные с помощью указателя контекста устройства. Дополнительные сведения о контекстах устройства и вызовах рисования см. в описании класса CDC и Работа с объектами окна в справочнике по MFC.
Дополнительные примеры создания OnDraw см. в разделе Примеры MFC.