lecoyote  | Code :
 - void CreateBMPFile(HWND hwnd, LPTSTR pszFile, PBITMAPINFO pbi,
 -                   HBITMAP hBMP, HDC hDC)
 -  {
 -      HANDLE hf;                 // file handle  
 -     BITMAPFILEHEADER hdr;       // bitmap file-header  
 -     PBITMAPINFOHEADER pbih;     // bitmap info-header  
 -     LPBYTE lpBits;              // memory pointer  
 -     DWORD dwTotal;              // total count of bytes  
 -     DWORD cb;                   // incremental count of bytes  
 -     BYTE *hp;                   // byte pointer  
 -     DWORD dwTmp;
 -     pbih = (PBITMAPINFOHEADER) pbi;
 -     lpBits = (LPBYTE) GlobalAlloc(GMEM_FIXED, pbih->biSizeImage);
 -     if (!lpBits)
 -          errhandler("GlobalAlloc", hwnd);
 -     // Retrieve the color table (RGBQUAD array) and the bits  
 -     // (array of palette indices) from the DIB.  
 -     if (!GetDIBits(hDC, hBMP, 0, (WORD) pbih->biHeight, lpBits, pbi,
 -         DIB_RGB_COLORS))
 -     {
 -         errhandler("GetDIBits", hwnd);
 -     }
 -     // Create the .BMP file.  
 -     hf = CreateFile(pszFile,
 -                    GENERIC_READ | GENERIC_WRITE,
 -                    (DWORD) 0,
 -                     NULL,
 -                    CREATE_ALWAYS,
 -                    FILE_ATTRIBUTE_NORMAL,
 -                    (HANDLE) NULL);
 -     if (hf == INVALID_HANDLE_VALUE)
 -         errhandler("CreateFile", hwnd);
 -     hdr.bfType = 0x4d42;        // 0x42 = "B" 0x4d = "M"  
 -     // Compute the size of the entire file.  
 -     hdr.bfSize = (DWORD) (sizeof(BITMAPFILEHEADER) +
 -                  pbih->biSize + pbih->biClrUsed
 -                  * sizeof(RGBQUAD) + pbih->biSizeImage);
 -     hdr.bfReserved1 = 0;
 -     hdr.bfReserved2 = 0;
 -     // Compute the offset to the array of color indices.  
 -     hdr.bfOffBits = (DWORD) sizeof(BITMAPFILEHEADER) +
 -                     pbih->biSize + pbih->biClrUsed
 -                     * sizeof (RGBQUAD);
 -     // Copy the BITMAPFILEHEADER into the .BMP file.  
 -     if (!WriteFile(hf, (LPVOID) &hdr, sizeof(BITMAPFILEHEADER),
 -         (LPDWORD) &dwTmp,  NULL))
 -     {
 -        errhandler("WriteFile", hwnd);
 -     }
 -     // Copy the BITMAPINFOHEADER and RGBQUAD array into the file.  
 -     if (!WriteFile(hf, (LPVOID) pbih, sizeof(BITMAPINFOHEADER)
 -                   + pbih->biClrUsed * sizeof (RGBQUAD),
 -                   (LPDWORD) &dwTmp, ( NULL))
 -         errhandler("WriteFile", hwnd);
 -     // Copy the array of color indices into the .BMP file.  
 -     dwTotal = cb = pbih->biSizeImage;
 -     hp = lpBits;
 -     if (!WriteFile(hf, (LPSTR) hp, (int) cb, (LPDWORD) &dwTmp,NULL))
 -            errhandler("WriteFile", hwnd);
 -     // Close the .BMP file.  
 -      if (!CloseHandle(hf))
 -            errhandler("CloseHandle", hwnd);
 -     // Free memory.  
 -     GlobalFree((HGLOBAL)lpBits);
 - }
 
  |  
    |