肯定是你的SelectObject和DeleteObject的使用有问题,凭现象只能猜测!把代码贴出来诊断一下!

解决方案 »

  1.   

    创建的每个新字体在使用完后一定要显示删除,不然它所占用的资源不被释放,在每次使用完pNewFont后,用pNewFont->DeleteObject()显示删除创建的字体对象。ok!
      

  2.   

    肯定是你的SelectObject和DeleteObject的使用有问题,凭现象只能猜测!把代码贴出来诊断一下!
      

  3.   

    但是我确实用DeleteObject()删除了字体对象的呀,源程序思想大致如下:
    为新字体申请内存 pNewFont=new CFont;
    创建新字体 pNewFont->CreateFontIndirect(&logfont);
    原来字体压入堆栈 PushFont(pCurrentFont);
    选择新字体 pDC->SelectObject(pNewFont); pCurrentFont=pNewFont;
    重新选择老字体
    删除当前字体 pCurrentFont->DeleteObject();delete pCurrentFont;
    从堆栈中弹出原字体 pCurrent=PopFont();pDC->SelectObject(pCurrentFont);
    以上代码是简写。
    当出现问题时发现pDC->SelectObject(pNewFont);的返回值为NULL,why?
      

  4.   

    Sorry!这么久才看到这个帖子!
    你的:
    选择新字体 pDC->SelectObject(pNewFont); pCurrentFont=pNewFont;
    这一句没有对pDC->SelectObject(pNewFont);函数的返回值进行保存,不是你自己创建的pCurrentFont;
    写一个规范的流程:
    {
        CFont fontNew;
        fontNew.CreateFontIndirect(...);//创建新字体
        CFont* pOldFont = (CFont*)(pDC->SelectObject(&fontNew));//选择新字体
        ...    pDC->SelectObject(pOldFont);//恢复旧字体
        fontNew.DelectObject();//删除新字体
    }
    你的错误不是压入堆栈错,是没有保存应当保存的原有字体!
    我的代码只是流程,有关字体变量的声明可以是成员变量,也可以是new出来的但有注释的四行的先后顺序不能错!