关于MFC中的OnPaint和OnDraw

Posted 我来乔23

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于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函数中。

  

 

以上是关于关于MFC中的OnPaint和OnDraw的主要内容,如果未能解决你的问题,请参考以下文章

MFC OnPaint()函数中最先调用CDialog::OnPaint()和最后调用CDialog::OnPaint()的巨大区别

MFC 中 OnPaint() 函数的使用

在 MFC C++ 程序中同时出现 OnPaint() 和 MouseMove 事件

MFC中的一般经验之谈----OnInitialUpdate

MFC OnPaint被不断调用的问题

MFC中ONPAINT、ONDRAW、ONERASEBKGND等绘图函数的使用场合和作用、区别是啥啊?