Bitmap Resources on Win32

Started by
0 comments, last by raptorstrike 19 years, 6 months ago
I need to know how to display a bitmap that I have listed in my resource.rc file using Windows functions.
=============================All knowledge is good; only the way it is put to use is good or evil.
Advertisement
its not that simple when you are using win32 api heres a bitmap class
//-----------------------------------------------------------------// Bitmap Class//-----------------------------------------------------------------class Bitmap{protected:  // Member Variables  HBITMAP m_hBitmap;  int     m_iWidth, m_iHeight;  // Helper Methods  void Free();public:  // Constructor(s)/Destructor  Bitmap();  Bitmap(HDC hDC, LPTSTR szFileName);  Bitmap(HDC hDC, UINT uiResID, HINSTANCE hInstance);  Bitmap(HDC hDC, int iWidth, int iHeight, COLORREF crColor = RGB(0, 0, 0));  virtual ~Bitmap();  // General Methods  BOOL Create(HDC hDC, LPTSTR szFileName);  BOOL Create(HDC hDC, UINT uiResID, HINSTANCE hInstance);  BOOL Create(HDC hDC, int iWidth, int iHeight, COLORREF crColor);  void Draw(HDC hDC, int x, int y, BOOL bTrans = FALSE,    COLORREF crTransColor = RGB(255, 0, 255));  void DrawPart(HDC hDC, int x, int y, int xPart, int yPart,    int wPart, int hPart, BOOL bTrans = FALSE,    COLORREF crTransColor = RGB(255, 0, 255));  int  GetWidth() { return m_iWidth; };  int  GetHeight() { return m_iHeight; };};

#include "Bitmap.h"//-----------------------------------------------------------------// Bitmap Constructor(s)/Destructor//-----------------------------------------------------------------Bitmap::Bitmap()  : m_hBitmap(NULL), m_iWidth(0), m_iHeight(0){}// Create a bitmap from a fileBitmap::Bitmap(HDC hDC, LPTSTR szFileName)  : m_hBitmap(NULL), m_iWidth(0), m_iHeight(0){  Create(hDC, szFileName);}// Create a bitmap from a resourceBitmap::Bitmap(HDC hDC, UINT uiResID, HINSTANCE hInstance)  : m_hBitmap(NULL), m_iWidth(0), m_iHeight(0){  Create(hDC, uiResID, hInstance);}// Create a blank bitmap from scratchBitmap::Bitmap(HDC hDC, int iWidth, int iHeight, COLORREF crColor)  : m_hBitmap(NULL), m_iWidth(0), m_iHeight(0){  Create(hDC, iWidth, iHeight, crColor);}Bitmap::~Bitmap(){  Free();}//-----------------------------------------------------------------// Bitmap Helper Methods//-----------------------------------------------------------------void Bitmap::Free(){  // Delete the bitmap graphics object  if (m_hBitmap != NULL)  {    DeleteObject(m_hBitmap);    m_hBitmap = NULL;  }}//-----------------------------------------------------------------// Bitmap General Methods//-----------------------------------------------------------------BOOL Bitmap::Create(HDC hDC, LPTSTR szFileName){  // Free any previous bitmap info  Free();  // Open the bitmap file  HANDLE hFile = CreateFile(szFileName, GENERIC_READ, FILE_SHARE_READ, NULL,    OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);  if (hFile == INVALID_HANDLE_VALUE)    return FALSE;  // Read the bitmap file header  BITMAPFILEHEADER  bmfHeader;  DWORD             dwBytesRead;  BOOL bOK = ReadFile(hFile, &bmfHeader, sizeof(BITMAPFILEHEADER),    &dwBytesRead, NULL);  if ((!bOK) || (dwBytesRead != sizeof(BITMAPFILEHEADER)) ||    (bmfHeader.bfType != 0x4D42))  {    CloseHandle(hFile);    return FALSE;  }  BITMAPINFO* pBitmapInfo = (BITMAPINFO*)(new BITMAPINFO_256);  if (pBitmapInfo != NULL)  {    // Read the bitmap info header    bOK = ReadFile(hFile, pBitmapInfo, sizeof(BITMAPINFOHEADER),      &dwBytesRead, NULL);    if ((!bOK) || (dwBytesRead != sizeof(BITMAPINFOHEADER)))    {      CloseHandle(hFile);      Free();      return FALSE;    }    // Store the width and height of the bitmap    m_iWidth = (int)pBitmapInfo->bmiHeader.biWidth;    m_iHeight = (int)pBitmapInfo->bmiHeader.biHeight;    // Skip (forward or backward) to the color info, if necessary    if (pBitmapInfo->bmiHeader.biSize != sizeof(BITMAPINFOHEADER))      SetFilePointer(hFile, pBitmapInfo->bmiHeader.biSize - sizeof        (BITMAPINFOHEADER), NULL, FILE_CURRENT);    // Read the color info    bOK = ReadFile(hFile, pBitmapInfo->bmiColors,      pBitmapInfo->bmiHeader.biClrUsed * sizeof(RGBQUAD), &dwBytesRead,      NULL);    // Get a handle to the bitmap and copy the image bits    PBYTE pBitmapBits;    m_hBitmap = CreateDIBSection(hDC, pBitmapInfo, DIB_RGB_COLORS,      (PVOID*)&pBitmapBits, NULL, 0);    if ((m_hBitmap != NULL) && (pBitmapBits != NULL))    {      SetFilePointer(hFile, bmfHeader.bfOffBits, NULL, FILE_BEGIN);      bOK = ReadFile(hFile, pBitmapBits, pBitmapInfo->bmiHeader.biSizeImage,        &dwBytesRead, NULL);      if (bOK)        return TRUE;    }  }  // Something went wrong, so cleanup everything  Free();  return FALSE;}BOOL Bitmap::Create(HDC hDC, UINT uiResID, HINSTANCE hInstance){  // Free any previous DIB info  Free();  // Find the bitmap resource  HRSRC hResInfo = FindResource(hInstance, MAKEINTRESOURCE(uiResID), RT_BITMAP);  if (hResInfo == NULL)    return FALSE;  // Load the bitmap resource  HGLOBAL hMemBitmap = LoadResource(hInstance, hResInfo);  if (hMemBitmap == NULL)    return FALSE;  // Lock the resource and access the entire bitmap image  PBYTE pBitmapImage = (BYTE*)LockResource(hMemBitmap);  if (pBitmapImage == NULL)  {    FreeResource(hMemBitmap);    return FALSE;  }  // Store the width and height of the bitmap  BITMAPINFO* pBitmapInfo = (BITMAPINFO*)pBitmapImage;  m_iWidth = (int)pBitmapInfo->bmiHeader.biWidth;  m_iHeight = (int)pBitmapInfo->bmiHeader.biHeight;  // Get a handle to the bitmap and copy the image bits  PBYTE pBitmapBits;  m_hBitmap = CreateDIBSection(hDC, pBitmapInfo, DIB_RGB_COLORS,    (PVOID*)&pBitmapBits, NULL, 0);  if ((m_hBitmap != NULL) && (pBitmapBits != NULL))  {    const PBYTE pTempBits = pBitmapImage + pBitmapInfo->bmiHeader.biSize +      pBitmapInfo->bmiHeader.biClrUsed * sizeof(RGBQUAD);    CopyMemory(pBitmapBits, pTempBits, pBitmapInfo->bmiHeader.biSizeImage);    // Unlock and free the bitmap graphics object    UnlockResource(hMemBitmap);    FreeResource(hMemBitmap);    return TRUE;  }  // Something went wrong, so cleanup everything  UnlockResource(hMemBitmap);  FreeResource(hMemBitmap);  Free();  return FALSE;}BOOL Bitmap::Create(HDC hDC, int iWidth, int iHeight, COLORREF crColor){  // Create a blank bitmap  m_hBitmap = CreateCompatibleBitmap(hDC, iWidth, iHeight);  if (m_hBitmap == NULL)    return FALSE;  // Set the width and height  m_iWidth = iWidth;  m_iHeight = iHeight;  // Create a memory device context to draw on the bitmap  HDC hMemDC = CreateCompatibleDC(hDC);  // Create a solid brush to fill the bitmap  HBRUSH hBrush = CreateSolidBrush(crColor);  // Select the bitmap into the device context  HBITMAP hOldBitmap = (HBITMAP)SelectObject(hMemDC, m_hBitmap);  // Fill the bitmap with a solid color  RECT rcBitmap = { 0, 0, m_iWidth, m_iHeight };  FillRect(hMemDC, &rcBitmap, hBrush);  // Cleanup  SelectObject(hMemDC, hOldBitmap);  DeleteDC(hMemDC);  DeleteObject(hBrush);  return TRUE;}void Bitmap::Draw(HDC hDC, int x, int y, BOOL bTrans, COLORREF crTransColor){  DrawPart(hDC, x, y, 0, 0, GetWidth(), GetHeight(), bTrans, crTransColor);}void Bitmap::DrawPart(HDC hDC, int x, int y, int xPart, int yPart,  int wPart, int hPart, BOOL bTrans, COLORREF crTransColor){  if (m_hBitmap != NULL)  {    // Create a memory device context for the bitmap    HDC hMemDC = CreateCompatibleDC(hDC);    // Select the bitmap into the device context    HBITMAP hOldBitmap = (HBITMAP)SelectObject(hMemDC, m_hBitmap);    // Draw the bitmap to the destination device context    //if (bTrans)    //  TransparentBlt(hDC, x, y, wPart, hPart, hMemDC, xPart, yPart,    //    wPart, hPart, crTransColor);    //else      BitBlt(hDC, x, y, wPart, hPart, hMemDC, xPart, yPart, SRCCOPY);    // Restore and delete the memory device context    SelectObject(hMemDC, hOldBitmap);    DeleteDC(hMemDC);  }}

i know its alot of code thats why alot of people use SDL and allegro to hide the code for making a bitmap but if you want all your bitmaps to behave a diffrent then normal variables or if you want to create sub classes and such you can go the long route
if youll notice there are several construcors here one of witch dose load a bitmap from resource
____________________________"This just in, 9 out of 10 americans agree that 1 out of 10 americans will disagree with the other 9"- Colin Mochrie

This topic is closed to new replies.

Advertisement