关于MFC中的OnPaint和OnDraw

   当窗口发生改变后,会产生无效区域,这个无效的区域需要重画。

  一般Windows会发送两个消息WM_PAINT(通知客户区 有变化)和WM_NCPAINT(通知非客户区有变化)。

  非客户区的重画系统自己搞定了,而客户区的重画需要我们自己来完成。这就需要OnDraw()或 OnPaint()来重画窗口。

  CView类派生自CWnd类。而OnPaint()是CWnd的类成员,同时负责响应WM_PAINT消息。OnDraw()是CVIEW的成员函数,并且没有响应消息的功能。

  当视图变得无效时(包括大小的改变,移动,被遮盖等等),Windows 将 WM_PAINT 消息发送给它(可以利用Invalidate(),ValidateRgn(),ValidateRect()函数强制的重画窗口)。

  该视图的 OnPaint 处理函数通过创建 CPaintDC 类的DC对象来响应该消息并调用视图的 OnDraw 成员函数。通常我们不必编写重写的 OnPaint 处理成员函数。  

        void CView::OnPaint()
  {
     // standard paint routine
     CPaintDC dc(this);
     OnPrepareDC(&dc);
     OnDraw(&dc);
  }

  void CView::OnDraw(CDC*)
  {
  }

  

  既然OnPaint最后也要调用OnDraw,因此我们一般会在OnDraw函数中进行绘制。

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

    CDC* pDc = GetDC();                          // 注意:CPaintDC只能用于OnPaint
    CRect rect;
    GetClientRect( &rect );
    pDC->SetTextAlign( TA_BASELINE | TA_CENTER );
    pDC->TextOut( rect.right / 2, rect.bottom / 2, s, s.GetLength() );      

  }

  注意:如果CMyView重载了CView的OnPaint消息处理函数,此时子类的OnDraw函数是不响应的,只能将自己的绘图写在OnPaint函数中。

  

原文地址:https://www.cnblogs.com/MakeView660/p/6537716.html