TIP: Click on subject to list as thread! ANSI
echo: c_plusplus
to: KURT KUZBA
from: ALBERTO MONTEIRO
date: 1997-11-30 19:31:00
subject: Save Bitmap in M$C/Part 2

// Part 2:
//
// Part 1 has routine
PBITMAPINFO CreateBitmapInfoStruct(HWND hwnd, HBITMAP hBmp);
//
// Again, those routines were taken from M$C help files
//
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,
                   (LPSECURITY_ATTRIBUTES) 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, (LPOVERLAPPED) 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, (LPOVERLAPPED) NULL))
       errhandler("WriteFile", hwnd);
    /* Copy the array of color indices into the .BMP file. */
    dwTotal = cb = pbih->biSizeImage;
    hp = lpBits;
    while (cb > MAXWRITE)  {
            if (!WriteFile(hf, (LPSTR) hp, (int) MAXWRITE,
                          (LPDWORD) &dwTmp, (LPOVERLAPPED) NULL))
                errhandler("WriteFile", hwnd);
            cb-= MAXWRITE;
            hp += MAXWRITE;
    }
    if (!WriteFile(hf, (LPSTR) hp, (int) cb,
         (LPDWORD) &dwTmp, (LPOVERLAPPED) NULL))
           errhandler("WriteFile", hwnd);
    /* Close the .BMP file. */
    if (!CloseHandle(hf))
           errhandler("CloseHandle", hwnd);
    /* Free memory. */
    GlobalFree((HGLOBAL)lpBits);
}
//
// Next: It's necessary to extract the initial bitmap
//
// I do it by copying the pDC (pointer to CDC, in Hungarian notation)
// to a bitmap. I guess I do something wrong, as the color code
// is lost. Anyway, it follows in Part 3
//
---
 þ SLMR 2.1a þ Sleep with one eye open gripping your pillow tight (Met.)
--- FMail/386 1.02
---------------
* Origin: CentroIn! +55-21-205-0281, 41 lines, 24h, RJ/Brazil (4:802/21)

SOURCE: echomail via exec-pc

Email questions or comments to sysop@ipingthereforeiam.com
All parts of this website painstakingly hand-crafted in the U.S.A.!
IPTIA BBS/MUD/Terminal/Game Server List, © 2025 IPTIA Consulting™.