// Open the bitmap file and obtain the bitmap handle hbitmap openbmp file (HDC hDC, LPSTR lpszFileName) {HBITMAP hBmp = NULL; // read the bitmap file to obtain the bitmap HANDLE hFile = CreateFile (lpszFileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (hFile = success) return NULL; // read bitmap file header bitmapfileheader bmp fileheader; DWORD encoding; if (ReadFile (hFile, (LPVOID) & BMP fileheader, sizeof (BITMAPFILE HEADER), & dwNumberOfBytesRead, NULL) = 0) {CloseHandle (hFile); return NULL ;}// read bitmap information BITMAPINFO * pBmpInfo = new BITMAPINFO; if (ReadFile (hFile, pBmpInfo, sizeof (BITMAPINFOHEADER), & dwNumberOfBytesRead, NULL) = 0) {CloseHandle (hFile); return NULL;} // read bitmap data LPVOID pBmpData; // create the DIB bitmap handle hBmp = CreateDIBSection (hDC, pBmpInfo, DIB_PAL_COLORS, & pBmpData, NULL, 0); if (hBmp = NULL) {DWORD dwErr = G EtLastError (); return NULL;} else // read bitmap data if (ReadFile (hFile, pBmpData, pBmpInfo-> bmiHeader. biSizeImage, & dwNumberOfBytesRead, NULL) = 0) {CloseHandle (hFile); return NULL;} CloseHandle (hFile); return hBmp ;} // The following code stores a BITMAP in a file. For details, refer to msdn pbitmapinfo CreateBitmapInfoStruct (HWND hwnd, HBITMAP hBmp) {BITMAP bmp; PBITMAPINFO pbmi; WORD cClrBits; // Retrieve the bitmap's color format, width, and heigh T. if (! GetObject (hBmp, sizeof (BITMAP), (LPSTR) & bmp) return NULL; // Convert the color format to a count of bits. cClrBits = (WORD) (bmp. bmPlanes * bmp. bmBitsPixel); if (ccrbits = 1) ccrbits = 1; else if (ccrbits <= 4) ccrbits = 4; else if (ccrbits <= 8) ccrbits = 8; else if (cClrBits <= 16) cClrBits = 16; else if (cClrBits <= 24) cClrBits = 24; else cClrBits = 32; // Allocate memory for the BITMAPI NFO structure. (This structure // contains a BITMAPINFOHEADER structure and an array of RGBQUAD // data structures.) if (cClrBits! = 24) pbmi = (PBITMAPINFO) LocalAlloc (LPTR, sizeof (BITMAPINFOHEADER) + sizeof (RGBQUAD) * (1 <cClrBits )); // There is no RGBQUAD array for the 24-bit-per-pixel format. else pbmi = (PBITMAPINFO) LocalAlloc (LPTR, sizeof (BITMAPINFOHEADER); // Initialize the fields in the BITMAPINFO structure. pbmi-> bmiHeader. biSize = sizeof (BITMAPINFOHEADER); pbmi-> bmiHeader. biWidth = bmp. bmWidth; pbmi-> bmiHeader. biH Eight = bmp. bmHeight; pbmi-> bmiHeader. biPlanes = bmp. bmPlanes; pbmi-> bmiHeader. biBitCount = bmp. bmBitsPixel; if (cClrBits <24) pbmi-> bmiHeader. biClrUsed = (1 <cClrBits); // If the bitmap is not compressed, set the BI_RGB flag. pbmi-> bmiHeader. biCompression = BI_RGB; // Compute the number of bytes in the array of color // indices and store the result in biSizeImage. // For Windows NT/2000, the wid Th must be DWORD aligned unless // the bitmap is RLE compressed. this example shows this. // For Windows 95/98, the width must be WORD aligned unless the // bitmap is RLE compressed. pbmi-> bmiHeader. biSizeImage = (pbmi-> bmiHeader. biWidth * cClrBits + 31 )&~ 31)/8 * pbmi-> bmiHeader. biHeight; // Set biClrImportant to 0, indicating that all of the // device colors are important. pbmi-> bmiHeader. biClrImportant = 0; return pbmi;} 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) return; // 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) {return;} // Create. BMP file. hf = CreateFile (pszFile, GENERIC_READ | GENERIC_WRITE, (DWORD) 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, (HANDLE) NULL); if (hf = INVALID_HANDLE_VALUE) return; hdr. bfType = 0x4d42; // 0x42 = "B" 0x4d = "M" // Compute the size of the entire file. hdr. bfSize = (DWORD) (sizeof (BITM APFILEHEADER) + 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. BMP file. if (! WriteFile (hf, (LPVOID) & hdr, sizeof (BITMAPFILEHEADER), (LPDWORD) & dwTmp, NULL) {return ;}// Copy the BITMAPINFOHEADER and RGBQUAD array into the file. if (! WriteFile (hf, (LPVOID) pbih, sizeof (BITMAPINFOHEADER) + pbih-> biClrUsed * sizeof (RGBQUAD), (LPDWORD) & dwTmp, (NULL) return; // Copy the array of color indices into. BMP file. dwTotal = cb = pbih-> biSizeImage; hp = lpBits; if (! WriteFile (hf, (LPSTR) hp, (int) cb, (LPDWORD) & dwTmp, NULL) return; // Close the. BMP file. if (! CloseHandle (hf) return; GlobalFree (HGLOBAL) lpBits);} void ctextonbmp DLG: OnButton1 () {// TODO: Add your control notification handler code here // TODO: add your control notification handler code here HDC hDC =: GetDC (GetSafeHwnd (); HDC hMemDC = CreateCompatibleDC (hDC); // open the bitmap file HBITMAP hBmp = openbmp file (hDC, "d: \ temp \ 6370 burn write \ 6484884.bmp"); SelectObject (hMemDC, hBmp); // write RECT rect RECT = {50, 50,200,200} on the in-place graph }; setBkMode (hMemDC, TRANSPARENT); DrawText (hMemDC, "hello",-1, & rect, DT_VCENTER); // Save the bitmap to the file PBITMAPINFO pBmpInfo = CreateBitmapInfoStruct (GetSafeHwnd (), hBmp); CreateBMPFile (GetSafeHwnd (), "Test.bmp", pBmpInfo, hBmp, hDC); DeleteDC (hMemDC); DeleteObject (hBmp );}