在单文本的工程里建了一个基于对话框的类,然后建了一个OnPaint()函数,为什么运行到CPaintDC dc(this)就报错debug assertion failed???
这个函数是什么作用啊?
void CZFTDlg::OnPaint()
{   
float  MaxCoLorHist;  
  
    CPaintDC dc(this);
  
    CWnd *pWnd=GetDlgItem(IDC_COORD);
    CDC* pDC=pWnd->GetDC();
pWnd->Invalidate();
    pWnd->UpdateWindow();
pDC->Rectangle(0,0,330,512);
CPen* pPenRed = new CPen;
    pPenRed->CreatePen(PS_SOLID,2,RGB(255,0,0));
    CGdiObject* pOldPen=pDC->SelectObject(pPenRed);
    pDC->MoveTo(10,10);
    pDC->LineTo(10,280);}

解决方案 »

  1.   

    OnPaint()使用来重画的,光看上面的代码好像没有什么问题,CPaintDC dc(this);你也没有使用,注释掉还有问题的话,就是调用的有问题了
      

  2.   

    这是响应WM_PAINT消息的函数,你自己建了这个函数可能漏了点什么,,CPaintDC中能用在响应该WM_PAINT消息的函数中
      

  3.   


    CPaintDC能用在响应该WM_PAINT消息的函数中
      

  4.   

    把断点设置在 CPaintDC dc(this);执行到这里是没有错的,继续就报错了
    为什么?
      

  5.   

     Devang 
    似乎你说的和书上的相似
    我没有很清楚的概念,那我应该怎么改啊?怎么用在相应WM_PAINT消息函数
      

  6.   

    菜单View/Class Wizard (Ctrl+w),选中你的对话框类,选中WM_PAINT消息,Add Function先要把你建的OnPaint()删掉
      

  7.   


    按你的方法做,弄好了
    而且OnPaint()是自己调用的
    为什么呢?
      

  8.   

    晕啊,你看书比在这里问快多了,,侯俊杰:
    Win32程序观念:message based,event driven,multitasking,multithreading,console programming.
      

  9.   

    每次需要重绘窗口时(程序开始,窗口大小变化,拖动等)都会触发WM_PAINT消息
      

  10.   

    代码还是有点问题的,但是不明显,你可以把你Debug assert error所报的出错代码行告诉大家可以帮你看看你的代码问题主要是:如果你在WM_PAINT做任何事情,无论在OnPaint中,还是在其调用的子函数中,你都不能在通过诸如GetDC, GetClientDC, CClientDC等函数再获得窗口的DC,否则会导致DC环境异常。因此你下面代码中pWnd->GetDC后,调用pWnd->Invalidate就是错误的,这样就会导致你这里得到的pDC和Invalidate触发的CPaintDC在不同地方同时绘制,从而导致错误。你这里要么在UpdateWindow之后在GetDC,要么就不要Invalidate+UpdateWindowvoid CZFTDlg::OnPaint() 
    {    
    float  MaxCoLorHist;   
       
        CPaintDC dc(this); 
       
        CWnd *pWnd=GetDlgItem(IDC_COORD); 
        CDC* pDC=pWnd->GetDC(); 
    pWnd->Invalidate(); 
        pWnd->UpdateWindow(); 
    pDC->Rectangle(0,0,330,512); 
    CPen* pPenRed = new CPen; 
        pPenRed->CreatePen(PS_SOLID,2,RGB(255,0,0)); 
        CGdiObject* pOldPen=pDC->SelectObject(pPenRed); 
        pDC->MoveTo(10,10); 
        pDC->LineTo(10,280); }