如何将客户区的某块区域保存为一幅位图,请高手指点,不胜感激!

解决方案 »

  1.   

    http://search.csdn.net/Expert/topic/460/460729.xml?temp=.5991632
      

  2.   


    BOOL CEastDrawView::SaveDIB(CBitmap*pbitmap, CFile&file)
    {
        CClientDC dc(this);
    OnPrepareDC(&dc);
    dc.SetWindowOrg(m_CenterPoint);
    CDC*pViewDC=&dc;
        CEastDrawDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc); CBitmap*Oldmap;
        CBitmap Bitmap;
    CDC memDC;
        Bitmap.CreateCompatibleBitmap(pViewDC,this->GetTotalSize().cx,this->GetTotalSize().cy);
        memDC.CreateCompatibleDC(pViewDC);
        memDC.SetMapMode(pViewDC->GetMapMode());
    Oldmap=memDC.SelectObject(&Bitmap);

    memDC.SetWindowOrg(m_CenterPoint);
    memDC.PatBlt(m_CenterPoint.x,m_CenterPoint.y,GetTotalSize().cx,GetTotalSize().cy,WHITENESS);

    this->DrawAll(&memDC);
        if(this->m_HaveAxis)
    this->DrawAxis(&memDC);
    ::GdiFlush();
    memDC.SelectObject(Oldmap);
    memDC.DeleteDC();

    BITMAPFILEHEADER bmfHdr; 

        bmfHdr.bfType=0x4d42;
    int sizeHdr=sizeof(BITMAPINFOHEADER);
       
        LPBITMAPINFOHEADER lpBI=( LPBITMAPINFOHEADER)::GlobalAlloc(LMEM_FIXED,sizeHdr);
      if(!lpBI)
    {
      AfxMessageBox("内存申请失败,请稍后再试");

    }
    BYTE *pDib;
    BYTE *pDib2;
        pDib=(BYTE*)::GlobalAlloc(LMEM_FIXED,GetTotalSize().cx*GetTotalSize().cy*4);
        if(!pDib)
    {
      AfxMessageBox("内存申请失败,请稍后再试");

    }
    lpBI->biSize=(LONG)sizeof(BITMAPINFOHEADER);
    lpBI->biWidth=(LONG)this->GetTotalSize().cx;
    lpBI->biHeight=(LONG)this->GetTotalSize().cy;
    lpBI->biPlanes=1;
    lpBI->biBitCount=32;
    lpBI->biCompression=BI_RGB;
    lpBI->biSizeImage=0;
    lpBI->biXPelsPerMeter=0;
    lpBI->biYPelsPerMeter=0;
    lpBI->biClrUsed=0;
    lpBI->biClrImportant=0;   
        Bitmap.GetBitmapBits(GetTotalSize().cx*GetTotalSize().cy*4,pDib); pDib2=(BYTE*)::GlobalAlloc(LMEM_FIXED,GetTotalSize().cx*GetTotalSize().cy*4);
      if(!pDib2)
    {
      AfxMessageBox("内存申请失败,请稍后再试");

    }

    for(int j=0;j<GetTotalSize().cy;j++)
     for(int i=0;i<GetTotalSize().cx*4;i++)
     {
      pDib2[i+j*GetTotalSize().cx*4]=pDib[GetTotalSize().cx*(GetTotalSize().cy-1-j)*4+i];
    }
     ::GlobalFree(pDib);
        bmfHdr.bfSize=(DWORD) (sizeof(BITMAPFILEHEADER) + 
                     sizeHdr +GetTotalSize().cx*GetTotalSize().cy*4); 
    bmfHdr.bfReserved1=bmfHdr.bfReserved2=0;
    bmfHdr.bfOffBits=sizeof(BITMAPFILEHEADER)+sizeHdr;

      try
      {
     
         file.Write((LPVOID)&bmfHdr,sizeof(BITMAPFILEHEADER));
     file.Write((LPVOID)lpBI,sizeHdr);
     file.WriteHuge((LPVOID)pDib2,GetTotalSize().cx*GetTotalSize().cy*4);
      }  catch(CException*Fe)
      {
        Fe->ReportError();
    Fe->Delete();
       return false;
      }
      
     
      ::GlobalFree(lpBI);
      ::GlobalFree(pDib2);
       return true;  
      }