第二次操作时 m_HBitmap!=0 没释放。

解决方案 »

  1.   

    在 重新 初始化 m_HBitmap 前。
      

  2.   

    inline CImage::CImage() throw() :
    m_hBitmap( NULL ),
    m_pBits( NULL ),
    m_hDC( NULL ),
    m_nDCRefCount( 0 ),
    m_hOldBitmap( NULL ),
    m_nWidth( 0 ),
    m_nHeight( 0 ),
    m_nPitch( 0 ),
    m_nBPP( 0 ),
    m_iTransparentColor( -1 ),
    m_bHasAlphaChannel( false ),
    m_bIsDIBSection( false )
    {
    s_initGDIPlus.IncreaseCImageCount();
    }inline CImage::~CImage() throw()
    {
    Destroy();
    s_initGDIPlus.DecreaseCImageCount();
    DeleteObject(m_hBitmap);
    }写这了,还是报错
      

  3.   

    CImage::~CImage() 
    可能没调用, 对象没释放,
    对象本身不需要释放, 是对象里的 m_hBitmap 要delete。找到第二次 使用这个对象的地方。
      

  4.   

     m_hBitmap我自己没有定义,是程序中用到m_Image.BitBlt和m_Image.StretchBlt。在用CImage自带的函数时,里面有 m_hBitmap
      

  5.   

    写在destroy之前或者写在析构函数中都可以。总之在m_hBitmap下次创建之前,老的m_hBitmap被删掉就可以了。
      

  6.   

    那就是:
    if(m_Image.m_hBitmap !=0 ) DeleteObject(m_Image.m_hBitmap);
      

  7.   

    void CEx_ImageView::OnDraw(CDC* pDC)
    {
    CEx_ImageDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);

        if (!m_Image.IsNull())
        { 
    //HDC hDC=m_Image.GetDC();
    //CDC *pDC=CDC::FromHandle(hDC);
    CRect rect;
          GetClientRect(&rect);
        int rw = rect.right - rect.left;            // 求出图片控件的宽和高
            int rh = rect.bottom - rect.top;
            int iw =(int)canshu* m_Image.GetWidth();                     // 读取图片的宽和高
            int ih = (int)canshu*m_Image.GetWidth();
            int tx = (int)(rw - iw)/2;                    // 使图片的显示位置正好在控件的正中
            int ty = (int)(rh - ih)/2; 
    //m_Image.Draw(pDC->m_hDC,tx,ty,iw,ih,0,0,m_Image.GetWidth(),m_Image.GetHeight());
    if(tx>=0&&ty>=0)
    {
    //m_Image.Draw(pDC->m_hDC,tx,ty,iw,ih,0,0,m_Image.GetWidth(),m_Image.GetHeight()); 
    int tx = (int)(rw - m_Image.GetWidth())/2; 
    int ty = (int)(rh - m_Image.GetHeight())/2; 
    ::SetStretchBltMode(pDC->m_hDC, HALFTONE);
    ::SetBrushOrgEx(pDC->m_hDC, 0, 0, NULL);
    m_Image.StretchBlt(*pDC,tx,ty,iw,ih,0,0,m_Image.GetWidth(),m_Image.GetHeight(),SRCCOPY);
    }
    else
    {
    if ((iw/rw)>(ih/rh))
    {

    ty=(int)(rh-(rw*ih)/iw)/2;
    //m_Image.Draw(pDC->m_hDC,0,ty,rw,rh-2*ty,0,0,m_Image.GetWidth(),m_Image.GetHeight());
    ::SetStretchBltMode(pDC->m_hDC, HALFTONE);
    ::SetBrushOrgEx(pDC->m_hDC, 0, 0, NULL);
    m_Image.StretchBlt(*pDC,0,ty,rw,rh-2*ty,0,0,m_Image.GetWidth(),m_Image.GetHeight(),SRCCOPY);
    }
    else
    {
     
    tx=(int)(rw-(rh*m_Image.GetWidth())/m_Image.GetHeight())/2;
    //m_Image.Draw(pDC->m_hDC,tx,0,rw-2*tx,rh,0,0,m_Image.GetWidth(),m_Image.GetHeight());
    ::SetStretchBltMode(pDC->m_hDC, HALFTONE);
    ::SetBrushOrgEx(pDC->m_hDC, 0, 0, NULL);
    m_Image.StretchBlt(*pDC,tx,0,rw-2*tx,rh,0,0,m_Image.GetWidth(),m_Image.GetHeight(),SRCCOPY);
    }


        }  // TODO: 在此处为本机数据添加绘制代码
    ReleaseDC(pDC);
    }void CEx_ImageView::OnMouseMove(UINT nFlags, CPoint point)
    {
    // TODO: 在此添加消息处理程序代码和/或调用默认值
    if(mouse_m=1)
    {
    CString cord; 
    int dd; 
    CRect srect,drect,mrect; 
    CMainFrame *pFrame = (CMainFrame *)AfxGetApp()->m_pMainWnd ; 
    CStatusBar *pStatus = &pFrame->m_wndStatusBar ; 
    if (pStatus) 

    cord.Format(_T("X=%d, Y=%d"),point.x,point.y); 
    pStatus->SetPaneText (1,cord); 
    srect.left = point.x - s; 
    srect.top = point.y - s; 
    srect.right = point.x + s; 
    srect.bottom = point.y + s; drect.left = point.x - d; 
    drect.top = point.y - d; 
    drect.right = point.x + d; 
    drect.bottom = point.y + d; mrect.left = oldx - d; 
    mrect.top = oldy - d; 
    mrect.right = oldx + d; 
    mrect.bottom = oldy + d; 
    dd = 2*d; 

    CDC * pDC = GetDC(); 
    OnPrepareDC(pDC);  if (recover) 

    //::DeleteObject(m_Image);
    m_Image.BitBlt(*pDC,mrect.left,mrect.top,dd,dd, mrect.left,mrect.top,mana);
        //m_Image.ReleaseDC();
    //if(m_Image.m_hBitmap !=0 )::DeleteObject(m_Image.m_hBitmap);
    //if (m_hBitmap) ::DeleteObject(m_hBitmap);

    //::DeleteObject(m_Image);
    ::SetStretchBltMode(pDC->m_hDC, HALFTONE);
    ::SetBrushOrgEx(pDC->m_hDC, 0, 0, NULL);
    m_Image.StretchBlt(*pDC,drect.left,drect.top, drect.Width(),drect.Height(),srect.left, srect.top,srect.Width(),srect.Height(),mana); 
    oldx = point.x; 
    oldy = point.y; 
    ReleaseDC(pDC); 

    recover = true; 
    }
    CView::OnMouseMove(nFlags, point);
    }问题出在这两个地方,您再帮我看看
      

  8.   

    “if(mouse_m=1)” ==问题在哪句 ?
      

  9.   

    在和m_Image.BilBlt,m_Image.StretchBlt,相关的地方
      

  10.   

    void CEx_ImageView::OnDraw(CDC* pDC)这里是显示图片
    void CEx_ImageView::OnMouseMove(UINT nFlags, CPoint point)这里是响应鼠标位置,进行局部放大
      

  11.   

    98 99 100行都表示:m_hBitmap无法计算表达式的值
      

  12.   

    99 100:
            ::SetStretchBltMode(pDC->m_hDC, HALFTONE);
            ::SetBrushOrgEx(pDC->m_hDC, 0, 0, NULL);
    不对吧? 给语句, 不要 号!
      

  13.   

    就是那个“if(mouse_m=1)” 的问题,,,太尴尬了,谢谢你回答这么多问题!
      

  14.   

    要先将位图资源与对象进行分离,即在使用CImage 的Destroy()前,加CImage的Detach()。