//get dib handle,then write into file
//write DIB into File
BOOL WriteDIB( LPTSTR szFile, HANDLE hDIB)
{
BITMAPFILEHEADER hdr;
LPBITMAPINFOHEADER lpbi; if (!hDIB)
return FALSE; CFile file;
if( !file.Open( szFile, CFile::modeWrite|CFile::modeCreate) )
return FALSE; lpbi = (LPBITMAPINFOHEADER)hDIB; int nColors = 1 << lpbi->biBitCount; // Fill in the fields of the file header 
hdr.bfType = ((WORD) ('M' << 8) | 'B'); // is always "BM"
hdr.bfSize = GlobalSize (hDIB) + sizeof( hdr );
hdr.bfReserved1  = 0;
hdr.bfReserved2  = 0;
hdr.bfOffBits = (DWORD) (sizeof( hdr ) + lpbi->biSize +
nColors * sizeof(RGBQUAD)); // Write the file header 
file.Write( &hdr, sizeof(hdr) ); // Write the DIB header and the bits 
file.Write( lpbi, GlobalSize(hDIB) ); return TRUE;
}

解决方案 »

  1.   

    小声的问,
    怎么得到dib handle呀?
      

  2.   

    HBITMAP bitmap;
    bitmap=(HBITMAP)LoadImage(AfxGetInstanceHandle(),"d:\\1.bmp", IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION);
      

  3.   

    小声地回答:
    假设你有CBitmap bmp;
    HBITMAP hBmp = (HBITMAP)bmp;
      

  4.   

    HANDLE CBmpPro::GetHDib() const

    // 如果本身类中原来没有位图,函数返回NULL
    if (!IsValid())
    return NULL; ASSERT(m_pInfo); // DIB内部形式尺寸(dibsize)
    DWORD infosize = CalculateDIBInfoSize((LPBITMAPINFOHEADER)m_pInfo);
    DWORD dibsize = CalculateDIBSize((LPBITMAPINFOHEADER)m_pInfo); // 创建DIB内存块,带GMEM_DDESHARE标识可以使该句柄用于剪贴板
    HANDLE h = ::GlobalAlloc(GMEM_MOVEABLE|GMEM_DDESHARE, dibsize);
    if (!h)
    return NULL; LPSTR lp = (LPSTR)::GlobalLock(h);
    if (lp)
    {
    // 拷入DIB信息
    ::memcpy((void *)lp, (const void *)m_pInfo, (size_t)infosize); // 获取DIB位数据
    HWND hWnd = ::GetDesktopWindow();
    ASSERT(hWnd);
    HDC hDC = ::GetDC(hWnd);
    if (!::GetDIBits(hDC,(HBITMAP)m_hObject,0,m_pInfo->bmiHeader.biHeight,\
    (LPVOID)((DWORD)lp+infosize),(LPBITMAPINFO)lp,DIB_RGB_COLORS))
    {
    ::GlobalUnlock(h);
    ::GlobalFree(h);
    ::ReleaseDC(hWnd, hDC);
    return NULL;
    }
    ::ReleaseDC(hWnd, hDC);
    ::GlobalUnlock(h); return h; // 成功
    } ::GlobalFree(h); return NULL;
    }