• 关于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函数中。

      

  • 相关阅读:
    10uF的电容能滤除什么频率的电源纹波?
    Integrate Logic Analyzer入门
    状态机
    Setup和Hold(Max/Min)分析
    RS232
    Vivado时序分析概念setup time, hold time
    python学习第34天
    python学习第33天
    python学习第32天
    python学习第31天
  • 原文地址:https://www.cnblogs.com/MakeView660/p/6537716.html
Copyright © 2020-2023  润新知