在基于对话框的程序中,如果你派生了对话框的OnPaint函数,然后你把ClassWiziad自动生成的那个声明语句:CPaintDC dc(this);删除的话,当对话框显示后,会发现资源占用率为100%,程序老在那儿重绘。就因为这个原因,昨天害的我一下午调试,一个语句一个语句的注释,最后发现竟然是这个原因。所以,提醒一下,如果你重载了OnPaint函数,一定不要把那个声明语句去掉,不管你后面用不用那个dc。

解决方案 »

  1.   

    在SDK编程中有这样一个规定,处理PAINT消息时,允许使用已有DC,但不允许定义新的DC
    因此这也不是BUG.
      

  2.   

    你把其他代码再删掉一些,会发现更多BUG的。
      

  3.   

    晕了,不知道上面这些人看了我写的没。我并需要那个dc,我也不在那个dc上绘图,对我的程序来说,那个dc没有任何用处。当然,我在OnPaint中会获取另一个dc来绘图的。CPaintDC dc(this);这不是一个简单的声明语句吗?我不用这个dc为什么不能删除这一行?
      

  4.   

    楼主有点很哟,万千人都在用VC,几乎没听说有BUG,而你却发现了,微软应给你颁奖了,呵呵呵呵
      

  5.   

    那就给你说说清楚:CPaintDC::CPaintDC(CWnd* pWnd)
    {
    ASSERT_VALID(pWnd);
    ASSERT(::IsWindow(pWnd->m_hWnd)); if (!Attach(::BeginPaint(m_hWnd = pWnd->m_hWnd, &m_ps)))
    AfxThrowResourceException();
    }CPaintDC::~CPaintDC()
    {
    ASSERT(m_hDC != NULL);
    ASSERT(::IsWindow(m_hWnd)); ::EndPaint(m_hWnd, &m_ps);
    Detach();
    }你自己处理WM_PAINT消息,就要调用BeginPaint和EndPaint,CPaintDC为你做了。
    你把它删除了,WM_PAINT消息得不到处理,当然出问题。
    我在OnPaint中会获取另一个dc来绘图的
    +++++++++++++++++++++++++++++++++++++++
    这不是画蛇添足是什么?
      

  6.   

    哈哈~~~照此类推,偶还发现了VS2005的BUG~
      

  7.   

    删除可以,但必须在这个消息里面BeginPaint和EndPaint一下,否则系统认为没有处理会继续触发这个消息,资源占用率当然就会100%了。