谢谢!

解决方案 »

  1.   

    需要调用DeleteObject,为什么?因为每次调用CreatePen就会创建一个GDI对象,如果你不是放(DeleteObject)的话系统的GDI对象就会耗尽,而且不能恢复,很快你就要重起计算机了。
      

  2.   

    呵呵,开玩笑啊!在使用GDI对象(如pen,brush,font,bitmap等)时,要把它们选入设备描述表中; 
    用完后必须把它们从设备描述表中选出才可删除,否则删除是无效的。 
    下面的例子演示如何删除GDI对象: 
        CPen pen(PS_SOLID, 1, RGB(0, 128, 128)); 
        CPen* pPrevPen = pDC->SelectObject(&pen); 
        CBrush brush(RGB(0, 128, 128)); 
        CBrush* pPrevBrush = pDC->SelectObject(&brush); 
        ... 
        pDC->SelectObject(pPrevPen); 
        pDC->SelectObject(pPrevBrush); 
        pen.DeleteObject(); 
        brush.DeleteObject(); 
      

  3.   

    我跟踪进去看了DeleteObject的源代码的,在winhand.cpp第189行的下面这些代码是在进行判断,谁知道这是在干什么吗?不理解release版中没有这些判断,直接删除。
    void CHandleMap::RemoveHandle(HANDLE h)
    {
    // make sure the handle entry is consistent before deleting
    CObject* pTemp = LookupTemporary(h);
    if (pTemp != NULL)
    {
    // temporary objects must have correct handle values
    HANDLE* ph = (HANDLE*)((BYTE*)pTemp + m_nOffset);  // after CObject
    ASSERT(ph[0] == h || ph[0] == NULL);
    if (m_nHandles == 2)
    ASSERT(ph[1] == h);
    }
      

  4.   

    carbon107(<软件开发思想.h>) :
    为什么说“用完后必须把它们从设备描述表中选出才可删除,否则删除是无效的。”
    难道DC里面不是保存的一个CPen的备份吗?
      

  5.   

    一楼说的有道理,使用之前一定要先判断有没有已经存在的GDI对象,如果有先把旧的对象用
    DeleteObject()删除,否则回造成内存泄露,再创建新的将要使用的对象,用SelectObject()函数把新创建的GDI对象选入当前设备场景,用完之后要恢复以前的设置!释放资源,使用GDI对象一定要注意资源的释放!
      

  6.   

    同意 carbon107(<软件开发思想.h>) 
    必须“选出来”,否则删除没用