多文档保存Ondraw所画图像无法保存,请教高手帮助!!!!!!!!!!

解决方案 »

  1.   

    void CTFractalDoc::OnFileSave() 
    {
        CTFractalView* pView=(CTFractalView*)((CMainFrame*)AfxGetMainWnd())->GetActiveView();
    CRect rc=pView->m_ampRect;
    BOOL Whole=TRUE;
    if(rc.Width()*rc.Height()!=0)
    {
    SaveDlg dlg;//CFileDialog也可以,目的是获取需要保存的文件名
    if(dlg.DoModal()==IDCANCEL) return;
    else  Whole=dlg.m_bWhole;
    }
    if(Whole) pView->GetClientRect(&rc);
    else rc+=CPoint(2,2);
    SaveRectToBmp(pView,rc);
    }void CTFractalDoc::SaveRectToBmp(CWnd* pWnd,CRect& rect)
    {
    CDC* pWndDC,dcMem;
    CBitmap bitmap; pWndDC=pWnd->GetWindowDC();
    dcMem.CreateCompatibleDC(pWndDC); bitmap.CreateCompatibleBitmap(pWndDC,rect.Width(),rect.Height()); CBitmap* pOldBitmap=dcMem.SelectObject(&bitmap);
    dcMem.BitBlt(0,0,rect.Width(),rect.Height(),pWndDC,rect.left,rect.top,SRCCOPY);
        HBITMAP hBitmap=(HBITMAP)bitmap;
    CPalette* pPalette=dcMem.GetCurrentPalette();
    HANDLE hPalette=(HANDLE)pPalette;
     
    DWORD dwPaletteSize=0;
    if(hPalette!=NULL)
    dwPaletteSize=::GlobalSize(hPalette); BITMAP bm;
    ::GetObject(hBitmap,sizeof(BITMAP),&bm);
    BITMAPFILEHEADER bfh;
    BITMAPINFOHEADER bih; memset(&bfh,0,sizeof(BITMAPFILEHEADER));
    memset(&bih,0,sizeof(BITMAPINFOHEADER)); DWORD dwImageSize=bm.bmHeight*bm.bmWidthBytes; bfh.bfType='MB';
    bfh.bfSize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+dwPaletteSize+dwImageSize;
    bfh.bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+dwPaletteSize; bih.biSize=sizeof(BITMAPINFOHEADER);
    bih.biWidth=bm.bmWidth;
    bih.biHeight=bm.bmHeight;
    bih.biPlanes=bm.bmPlanes;
    bih.biBitCount=bm.bmBitsPixel;
    bih.biSizeImage=::GlobalSize(hBitmap); char szFilter[]=_T("BMP Files (*.bmp)|*.bmp|All Files(*.*)|*.*||");
    CFileDialog FileDlg(FALSE,NULL,NULL,OFN_HIDEREADONLY,szFilter);// if(FileDlg.DoModal()==IDCANCEL) return;
    CString szFileName=FileDlg.GetFileName();
    //auto detect and sure extend name is ".bmp"
    if(szFileName.Find(".bmp")==-1)
    szFileName+=".bmp"; CFile cf;
    if(cf.Open(szFileName,CFile::modeCreate|CFile::modeWrite))
    {
    cf.Write(&bfh,sizeof(BITMAPFILEHEADER));
    cf.Write(&bih,sizeof(BITMAPINFOHEADER));
    if(hPalette!=NULL)
    {
    char* pBuffer=(char*)::GlobalLock(hPalette);
    cf.Write(pBuffer,dwPaletteSize);
    ::GlobalUnlock(hPalette);
    }
    char* pDataBuffer=new char[dwImageSize];
    if(pDataBuffer!=NULL)
    {
    ::GetBitmapBits(hBitmap,dwImageSize,pDataBuffer);
    for(int i=0;i<bm.bmHeight;i++)
    {
    int nOffset;
    nOffset=bm.bmHeight-i-1;
    nOffset*=bm.bmWidthBytes;
    cf.Write(&pDataBuffer[nOffset],bm.bmWidthBytes);
    }
    delete[] pDataBuffer;
    }
    }
    dcMem.SelectObject(pOldBitmap);
    bitmap.Detach();
    }