在用MFC开发过程中,首先定义一个打开对话框,可以加载一幅BITMAP位图。
    
打开对话框函数:CFileDialog dlg(TRUE,_T("BMP"),_T("*.BMP"),OFN_HIDEREADONLY| OFN_OVERWRITEPROMPT,_T("BMP Files (*.bmp) |*.bmp"),NULL);然后载入位图在控件上显示出来。
    
载入函数:HBITMAP hbmp = (HBITMAP)::LoadImage(AfxGetInstanceHandle(), fileName, IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION|LR_LOADFROMFILE);
编译执行都通过了。运行的也没问题。我想问各位大师的是:当我再次加载一幅图像的时候出现错误对话框。然后点击忽略才会加载另一幅图像。怎么才能消除这个呢?急用。谢谢!

解决方案 »

  1.   

    你前一个hbmp没有安全释放吧
    点击重试可以定位到错误点
    看看是什么原因
      

  2.   

    重新加载之前先delete掉前面的
    或者用完之后及时delete掉
      

  3.   

    点重试的时候弹出:应用程序发生异常 unknow software exception (0x80000003),位置为 0x102137df。
      

  4.   

    HBITMAP hbmp如果是局部对象的话可以不释放,如果不是需要释放,才能再次加载!
      

  5.   

    HBITMAP hbmp我写在消息响应函数里的,另外我用释放资源了啊。 if( m_bmp.m_hObject != NULL 

            m_bmp.DeleteObject;
    每次都判断一下。
      

  6.   

    代码如下:BOOL CBITMAPDlg::OnShow() 
    {
    // TODO: Add your control notification handler code here
    //´´½¨±ê־λ

    m_flag2 = TRUE; if( m_bmp.m_hObject != NULL )//ÅжÏ

            m_bmp.DeleteObject();

    ///////////////////////////ÔØÈëͼÏñ////////////////////////    HBITMAP hbmp = (HBITMAP)::LoadImage(AfxGetInstanceHandle(), 

            fileName, IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION|LR_LOADFROMFILE);
        if( hbmp == NULL ) return FALSE;

    m_bmp.Attach( hbmp );

        DIBSECTION ds;

        BITMAPINFOHEADER &bminfo = ds.dsBmih; 

        m_bmp.GetObject( sizeof(ds), &ds );

        int cx=bminfo.biWidth;  //µÃµ½Í¼Ïñ¿í¶È

        int cy=bminfo.biHeight; //µÃµ½Í¼Ïñ¸ß¶È
    //Èç¹ûÌ«´ó£¬½«Í¼Æ¬°´Ò»¶¨±ÈÀýËõС

    //StretchBlt(

        /////////////////// ////////////////////////////////

       ///µÃµ½ÁËͼÏñµÄ¿í¶ÈºÍ¸ß¶Èºó,ÎÒÃǾͿÉÒÔ¶ÔͼÏñ´óС½øÐÐÊÊÓ¦,¼´µ÷Õû¿Ø¼þµÄ´óС,ÈÃËüÕýºÃÏÔʾһÕÅͼƬ///

        CRect rect;

        GetDlgItem(IDC_STATIC_BMP2)->GetWindowRect(&rect);

        ScreenToClient(&rect);

        GetDlgItem(IDC_STATIC_BMP2)->MoveWindow(rect.left,rect.top,cx,cy,true);//µ÷Õû´óС //Ìí¼ÓµÄ´úÂë,ÔڿؼþÉÏÏÔʾͼÏñ CPaintDC dc(GetDlgItem(IDC_STATIC_BMP2));
    CRect rcclient;

        GetDlgItem(IDC_STATIC_BMP2)->GetClientRect(&rcclient);

        CDC memdc;

        memdc.CreateCompatibleDC(&dc);  

        CBitmap bitmap;

        bitmap.CreateCompatibleBitmap(&dc, rcclient.Width(), rcclient.Height());

        memdc.SelectObject( &bitmap );

    CWnd::DefWindowProc(WM_PAINT, (WPARAM)memdc.m_hDC , 0);

    CDC maskdc;

        maskdc.CreateCompatibleDC(&dc);

        CBitmap maskbitmap;

        maskbitmap.CreateBitmap(rcclient.Width(), rcclient.Height(), 1, 1, NULL);

        maskdc.SelectObject( &maskbitmap );

        maskdc.BitBlt( 0, 0, rcclient.Width(), rcclient.Height(), &memdc, 

                  rcclient.left, rcclient.top, SRCCOPY);



        CBrush brush;

    //Initializes a brush with a pattern specified by a bitmap    brush.CreatePatternBrush(&m_bmp);

        dc.FillRect(rcclient, &brush);  

        
    dc.BitBlt(rcclient.left, rcclient.top, rcclient.Width(), rcclient.Height(), 

    &memdc, rcclient.left, rcclient.top,SRCPAINT);

        brush.DeleteObject();


    return TRUE;
    }void CBITMAPDlg::OnBtnRead() 
    {
    // TODO: Add your control notification handler code here

    }BOOL CBITMAPDlg::OnSelect() 
    {
    // TODO: Add your control notification handler code here
    //fileName.Empty(); //´´½¨Ñ¡Ôñ·¾¶°´Å¥ CFileDialog dlg(TRUE,_T("BMP"),_T("*.BMP"),OFN_HIDEREADONLY| OFN_OVERWRITEPROMPT,_T("BMP Files (*.bmp) |*.bmp"),NULL);
      
        if(dlg.DoModal()==IDCANCEL)  
    {
    return FALSE; 
    }

    //´´½¨Ò»¸ö±ê־λ m_flag1 = TRUE;
    //½«Â·¾¶Ãû±£´æ²¢ÏÔʾ³öÀ´
        
    fileName=dlg.GetPathName();
    GetDlgItem(IDC_BITMAP_ADDR)->SetWindowText(fileName);
    //µØÖ·±ä»»'\'---->'/'///////////
        
        //½«Cstringת»»Îªchar*

    char *p;    p=fileName.GetBuffer(fileName.GetLength()); for(int i=0;i<=fileName.GetLength();i++)
    {
    if(*p=='\\')
    {
    *p='/';
    }
    p++;
    } //½«char*ת»»ÎªCstring    *p='\0';
    p = fileName.GetBuffer(fileName.GetLength());    CString fileName(p);

    if( m_bmp.m_hObject != NULL )//ÅжÏ

            m_bmp.DeleteObject();//ÊÍ·Åλͼ×ÊÔ´ ///////////////////////////ÔØÈëͼÏñ////////////////////////    HBITMAP hbmp = (HBITMAP)::LoadImage(AfxGetInstanceHandle(), 

            fileName, IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION|LR_LOADFROMFILE);
            
     
        if( hbmp == NULL ) return FALSE;

    m_bmp.Attach( hbmp );

        DIBSECTION ds;

        BITMAPINFOHEADER &bminfo = ds.dsBmih; 

        m_bmp.GetObject( sizeof(ds), &ds );

        int cx=bminfo.biWidth;  //µÃµ½Í¼Ïñ¿í¶È

        int cy=bminfo.biHeight; //µÃµ½Í¼Ïñ¸ß¶È

        /////////////////// ////////////////////////////////

       ///µÃµ½ÁËͼÏñµÄ¿í¶ÈºÍ¸ß¶Èºó,ÎÒÃǾͿÉÒÔ¶ÔͼÏñ´óС½øÐÐÊÊÓ¦,¼´µ÷Õû¿Ø¼þµÄ´óС,ÈÃËüÕýºÃÏÔʾһÕÅͼƬ///

        CRect rect;

        GetDlgItem(IDC_STATIC_BMP1)->GetWindowRect(&rect);

        ScreenToClient(&rect);

        GetDlgItem(IDC_STATIC_BMP1)->MoveWindow(rect.left,rect.top,cx,cy,true);//µ÷Õû´óС
    //MessageBox("select"); //Ìí¼ÓµÄ´úÂë,ÔڿؼþÉÏÏÔʾͼÏñ CPaintDC dc(GetDlgItem(IDC_STATIC_BMP1));
    CRect rcclient;

        GetDlgItem(IDC_STATIC_BMP1)->GetClientRect(&rcclient);

        CDC memdc;

        memdc.CreateCompatibleDC(&dc);  

        CBitmap bitmap;

        bitmap.CreateCompatibleBitmap(&dc, rcclient.Width(), rcclient.Height());

        memdc.SelectObject( &bitmap );

    CWnd::DefWindowProc(WM_PAINT, (WPARAM)memdc.m_hDC , 0);

    CDC maskdc;

        maskdc.CreateCompatibleDC(&dc);

        CBitmap maskbitmap;

        maskbitmap.CreateBitmap(rcclient.Width(), rcclient.Height(), 1, 1, NULL);

        maskdc.SelectObject( &maskbitmap );

        maskdc.BitBlt( 0, 0, rcclient.Width(), rcclient.Height(), &memdc, 

                  rcclient.left, rcclient.top, SRCCOPY);



        CBrush brush;

    //Initializes a brush with a pattern specified by a bitmap    brush.CreatePatternBrush(&m_bmp);

        dc.FillRect(rcclient, &brush);  

        
    dc.BitBlt(rcclient.left, rcclient.top, rcclient.Width(), rcclient.Height(), 

    &memdc, rcclient.left, rcclient.top,SRCPAINT);

        brush.DeleteObject();

    //DeleteObject((HGDIOBJ)hbmp);  

    return TRUE;
    }
      

  7.   

    LZ这代码不敢恭维啊,随便看了一下m_bmp变量有点问题,在函数OnSelect()中,m_bmp你没有判断是不是空啊,如果不是空你又绑定一次肯定出错了!
      

  8.   

    貌似是这样写的!和attach是对应的
      

  9.   

    前面的要释放,然后再使用
    CBitmap bitmap;如果已经load了,再次load得释放 DeleteObject,然后再load
      

  10.   

    我估计是if( m_bmp.m_hObject != NULL)有问题,你在m_bmp.DeleteObject之前加一个MessageBox试试,如果消息框没弹出来就说明m_bmp.DeleteObject根本没执行,把if( m_bmp.m_hObject != NULL)改成if(hbmp)应该就可以了