zoukankan      html  css  js  c++  java
  • 关于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函数中。

      

  • 相关阅读:
    VHDL硬件描述语言(三)——基本数据对象和数据类型
    VHDL硬件描述语言(二)——子程序
    VHDL硬件描述语言(一)——基本结构
    C#类
    C#基本语法
    C#的简单数据类型
    C#与.NET
    ARP
    IPv6
    以太网
  • 原文地址:https://www.cnblogs.com/MakeView660/p/6537716.html
Copyright © 2011-2022 走看看