在视图中绘图

应用程序中几乎所有的绘图都发生在视图 OnDraw 的成员函数中,必须在视图类中重写该函数。 (异常是鼠标绘图,在 “通过视图解释用户输入”中讨论)。替代 OnDraw

  1. 通过调用所提供的文档成员函数获取数据。

  2. 通过调用框架传递给 OnDraw的设备上下文对象的成员函数来显示数据。

以某种方式更改文档的数据时,必须重新绘制视图以反映更改。 通常,当用户通过文档视图进行更改时,就会发生这种情况。 在这种情况下,视图调用文档的 UpdateAllViews 成员函数,以通知同一文档上的所有视图以更新自己。 UpdateAllViews 调用每个视图的 OnUpdate 成员函数。 默认实现 OnUpdate 使视图的整个工作区失效。 可以重写它以仅使映射到文档修改部分的工作区区域失效。

UpdateAllViewsCDocument的成员函数和OnUpdateCView的成员函数允许您传递描述文档的修改部分的信息。 使用此“提示”机制可以限制视图必须重绘的区域。 OnUpdate 采用两个“hint”参数。 LPARAM 类型的第一个 lHint 允许传递所需的任何数据,而类型CObject为 *的第二个 pHint 允许将指针传递给派生自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如果调用用于屏幕绘图,CDC则传入 pDC 的对象是CPaintDC其构造函数已调用BeginPaint的对象。 对绘图函数的调用是通过设备上下文指针进行的。 有关设备上下文和绘图调用的信息,请参阅 MFC 参考中的类 CDC 和使用窗口对象

有关如何写入 OnDraw的更多示例,请参阅 MFC 示例

另请参阅

使用视图