以下是截取屏幕的程序,怎么把截取得到 的结果保存到文件中去呢?
HBITMAP GetScreenBmp()
{
HWND hwnd = ::GetDesktopWindow();
HDC hsrc = ::GetDC(hwnd);
HDC hmemdc = ::CreateCompatibleDC(hsrc);
RECT rc;
::GetWindowRect(hwnd,&rc);
SIZE sz;
sz.cx = rc.right - rc.left;
sz.cy = rc.bottom - rc.top;
HBITMAP hbmp = ::CreateCompatibleBitmap(hsrc,sz.cx,sz.cy);
HGDIOBJ holdbmp = ::SelectObject(hmemdc,hbmp);
::BitBlt(hmemdc,0,0,sz.cx,sz.cy,hsrc,rc.left,rc.top,SRCCOPY);
::SelectObject(hmemdc,holdbmp);
::DeleteObject(hmemdc);
::ReleaseDC(hwnd,hsrc);
return hbmp;
}

解决方案 »

  1.   

    bool CImageAmalgamation::SaveBitmapToFile(HBITMAP hBitmap, char * szfilename)
    {
    HDC hDC; // 设备描述表  

    int iBits; // 当前显示分辨率下每个像素所占字节数 WORD wBitCount; // 位图中每个像素所占字节数 DWORD dwPaletteSize = 0 ; // 定义调色板大小, 位图中像素字节大小 ,
    // 位图文件大小 , 写入文件字节数 DWORD dwBmBitsSize ; DWORD dwDIBSize, dwWritten ; BITMAP Bitmap;         BITMAPFILEHEADER bmfHdr; //位图属性结构     BITMAPINFOHEADER bi; //位图文件头结构        LPBITMAPINFOHEADER lpbi;  //位图信息头结构      HANDLE          fh, hDib, hPal,hOldPal = NULL ; //指向位图信息头结构,定义文件,分配内存句柄,调色板句柄 //计算位图文件每个像素所占字节数 hDC = CreateDC( "DISPLAY" , NULL , NULL , NULL ) ; iBits = GetDeviceCaps( hDC , BITSPIXEL ) * GetDeviceCaps( hDC , PLANES ) ; DeleteDC( hDC ) ; if ( iBits <= 1 )
    {
    wBitCount = 1;
    } else if ( iBits <= 4 )
    {
    wBitCount = 4;
    } else if ( iBits <= 8 )
    {
    wBitCount = 8;
    } else if ( iBits <= 24 )
    {
    wBitCount = 24;
    } else if ( iBits <= 32 )
    {
    wBitCount = 32;
    } //计算调色板大小
    if ( wBitCount <= 8 )
    {
    dwPaletteSize = ( 1 << wBitCount ) * sizeof( RGBQUAD ) ;
    } //设置位图信息头结构 GetObject( hBitmap , sizeof( BITMAP ) , ( LPSTR ) & Bitmap ) ; bi.biSize            = sizeof( BITMAPINFOHEADER ); bi.biWidth           = Bitmap.bmWidth; bi.biHeight          = Bitmap.bmHeight; bi.biPlanes          = 1; bi.biBitCount        = wBitCount; bi.biCompression     = BI_RGB; bi.biSizeImage       = 0; bi.biXPelsPerMeter   = 0; bi.biYPelsPerMeter   = 0; bi.biClrUsed         = 0; bi.biClrImportant    = 0; dwBmBitsSize = ( ( Bitmap.bmWidth * wBitCount + 31 ) / 32 ) * 4 * Bitmap.bmHeight ; //为位图内容分配内存 hDib  = GlobalAlloc( GHND ,dwBmBitsSize + dwPaletteSize + sizeof( BITMAPINFOHEADER ) ) ; lpbi = ( LPBITMAPINFOHEADER )GlobalLock( hDib ) ; *lpbi = bi; // 处理调色板    hPal = GetStockObject( DEFAULT_PALETTE ); if ( hPal )
    { hDC = ::GetDC( NULL ); hOldPal = SelectPalette( hDC, (HPALETTE ) hPal , FALSE ) ; RealizePalette( hDC ) ; } // 获取该调色板下新的像素值 GetDIBits( hDC, hBitmap, 0, ( UINT ) Bitmap.bmHeight, ( LPSTR )lpbi + sizeof( BITMAPINFOHEADER ) + dwPaletteSize, ( LPBITMAPINFO )lpbi, DIB_RGB_COLORS ); //恢复调色板    if ( hOldPal )
    { SelectPalette( hDC, ( HPALETTE )hOldPal, TRUE ); RealizePalette( hDC ) ; ::ReleaseDC( NULL, hDC ) ;
    } //创建位图文件     fh = CreateFile( szfilename , GENERIC_WRITE,  0 , NULL , CREATE_ALWAYS , FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN , NULL ) ; if ( fh == INVALID_HANDLE_VALUE )
    {
    return false;
    } // 设置位图文件头 bmfHdr.bfType = 0x4D42;  // "BM" dwDIBSize = sizeof( BITMAPFILEHEADER ) + sizeof( BITMAPINFOHEADER ) + dwPaletteSize + dwBmBitsSize;   bmfHdr.bfSize = dwDIBSize; bmfHdr.bfReserved1 = 0;

    bmfHdr.bfReserved2 = 0; bmfHdr.bfOffBits = ( DWORD )sizeof( BITMAPFILEHEADER )  + ( DWORD )sizeof( BITMAPINFOHEADER ) + dwPaletteSize; // 写入位图文件头 WriteFile( fh, ( LPSTR )&bmfHdr, sizeof ( BITMAPFILEHEADER ), &dwWritten, NULL); // 写入位图文件其余内容 WriteFile( fh, ( LPSTR )lpbi, dwDIBSize,  &dwWritten , NULL ); //消除内存分配   GlobalUnlock( hDib ); GlobalFree( hDib ); CloseHandle( fh ); return true;
    }
      

  2.   

    void CCaptureDlg::SaveBmp()
    {
    CDC dc;
    dc.CreateDC("DISPLAY",NULL,NULL,NULL);
    CBitmap bm;
    int Width=GetSystemMetrics(SM_CXSCREEN);
    int Height=GetSystemMetrics(SM_CYSCREEN);
    bm.CreateCompatibleBitmap(&dc,Width,Height);
    CDC tdc;
    tdc.CreateCompatibleDC(&dc);
    CBitmap*pOld=tdc.SelectObject(&bm);
    tdc.BitBlt(0,0,Width,Height,&dc,0,0,SRCCOPY);
    tdc.SelectObject(pOld);
    BITMAP btm;
    bm.GetBitmap(&btm);
    DWORD size=btm.bmWidthBytes*btm.bmHeight;
    LPSTR lpData=(LPSTR)GlobalAllocPtr(GPTR,size);
    /////////////////////////////////////////////
    BITMAPINFOHEADER bih;
    bih.biBitCount=btm.bmBitsPixel;
    bih.biClrImportant=0;
    bih.biClrUsed=0;
    bih.biCompression=0;
    bih.biHeight=btm.bmHeight;
    bih.biPlanes=1;
    bih.biSize=sizeof(BITMAPINFOHEADER);
    bih.biSizeImage=size;
    bih.biWidth=btm.bmWidth;
    bih.biXPelsPerMeter=0;
    bih.biYPelsPerMeter=0;
    ///////////////////////////////////
    GetDIBits(dc,bm,0,bih.biHeight,lpData,(BITMAPINFO*)&bih,DIB_RGB_COLORS);
    // bm.GetBitmapBits(size,lpData); //此函数在处理5-5-5模式的16位色下会出现颜色混乱
    //////////////////////////////
    static int filecount=0;
    CString name;
    name.Format("pict%04d.bmp",filecount++);
    name=m_Path+name;
    BITMAPFILEHEADER bfh;
    bfh.bfReserved1=bfh.bfReserved2=0;
    bfh.bfType=((WORD)('M'<< 8)|'B');
    bfh.bfSize=54+size;
    bfh.bfOffBits=54;
    CFile bf;
    if(bf.Open(name,CFile::modeCreate|CFile::modeWrite)){
    bf.WriteHuge(&bfh,sizeof(BITMAPFILEHEADER));
    bf.WriteHuge(&bih,sizeof(BITMAPINFOHEADER));
    bf.WriteHuge(lpData,size);
    bf.Close();
    nCount++;
    }
    GlobalFreePtr(lpData);
    if(nCount==1)
    m_Number.Format("%d picture captured.",nCount);
    else
    m_Number.Format("%d pictures captured.",nCount);
    UpdateData(FALSE);
    }