This example shows a simplified version of the code in the WPBitmap object class. This example assumes that the image file only contains a single image and it is already in bitmap format.
SOM_Scope BOOL32 bmp_wpReadImageFile(WPBitmap *somSelf) { WPBitmapData *somThis = WPBitmapGetData(somSelf); CHAR szFileName[CCHMAXPATH]; HFILE hFile = NULLHANDLE; ULONG ulAction; FILESTATUS3 FileStatus; ULONG ulFileSize; PBYTE pBitmapData = NULL; APIRET RC; ULONG ulBytesRead; PBITMAPFILEHEADER pbfh; /* If the data has already been read, just return */ if(_pBitmapData) { return TRUE; } /* Find the bitmap data file */ _wpQueryFilename(somSelf, szFileName, TRUE); /* Open the file and find out how big it is */ if (DosOpen(szFileName, &hFile, &ulAction, 0L, FILE_NORMAL, FILE_OPEN, OPEN_ACCESS_READONLY | OPEN_SHARE_DENYNONE, NULL)) { return FALSE; } if (DosQueryFileInfo(hFile, FIL_STANDARD, &FileStatus, sizeof(FileStatus))) { DosClose (hFile); return FALSE; } /* Allocate space for a buffer large enough to contain the entire file */ ulFileSize = FileStatus.cbFile; pBitmapData = _wpAllocMem(somSelf,ulFileSize,FALSE); if (!pBitmapData) { DosClose (hFile); return FALSE; } /* Read the file into the buffer */ RC = DosRead (hFile, pBitmapData, ulFileSize, &ulBytesRead); DosClose(hFile); hFile = NULLHANDLE; if (RC || (ulBytesRead != ulFileSize)) { _wpFreeMem (somSelf,pBitmapData); return FALSE; } /* Make sure the bitmap header has a valid type code and the header * fits within the file */ pbfh = (PBITMAPFILEHEADER) pBitmapData; if (pbfh->usType != BFT_BMAP || (PCH)pbfh + pbfh->cbSize > pBitmapData + ulFileSize) { _wpFreeMem(somSelf,pBitmapData); return FALSE; } /* Save the bitmap data and exit */ _pBitmapData = pBitmapData; _ulBitmapDataSize = ulFileSize; return TRUE; }