CodeGuru Home VC++ / MFC / C++ .NET / C# Visual Basic VB Forums Developer.com
Results 1 to 2 of 2

Thread: CBitmap

  1. #1
    Join Date
    Apr 1999
    Posts
    9

    CBitmap

    Hey, can anybody help me??
    i'm trying to do this about 2 weeks but i can't get it...
    the problem is how to load and draw a Cbitmap object from a bmp file. I have read the section in this web site about bitmaps and paletts, but it doesn't work. I would like to get an example for aplication to load bmp file and then drawing it, can you do that??
    Thanks in anticipation.


  2. #2
    Join Date
    May 1999
    Location
    Austria
    Posts
    116

    Re: CBitmap

    Try this function to load a Bitmap into a CBitmap Objekt from a file:

    sBMPFile...The file you want to load
    bitmap...The CBitmap Objekt you want to fill with your File.
    pPal...Can be NULL

    BOOL LoadBMPImage( LPCTSTR sBMPFile, CBitmap& bitmap, CPalette *pPal )
    {
    CFile file;
    if( !file.Open( sBMPFile, CFile::modeRead) ) return FALSE;

    BITMAPFILEHEADER bmfHeader; // Read file header

    if (file.Read((LPSTR)&bmfHeader, sizeof(bmfHeader)) != sizeof(bmfHeader))
    return FALSE;

    // File type should be 'BM'

    if (bmfHeader.bfType != ((WORD) ('M' << 8) | 'B')) return FALSE;


    // Get length of the remainder of the file and allocate memory
    DWORD nPackedDIBLen = file.GetLength() - sizeof(BITMAPFILEHEADER);

    HGLOBAL hDIB = ::GlobalAlloc(GMEM_FIXED, nPackedDIBLen);
    if (hDIB == 0)
    return FALSE; // Read the remainder of the bitmap file.

    if (file.ReadHuge((LPSTR)hDIB, nPackedDIBLen) != nPackedDIBLen )
    {
    ::GlobalFree(hDIB);
    return FALSE;
    }

    BITMAPINFOHEADER &bmiHeader = *(LPBITMAPINFOHEADER)hDIB ;

    BITMAPINFO &bmInfo = *(LPBITMAPINFO)hDIB ;
    // If bmiHeader.biClrUsed is zero we have to infer the number
    // of colors from the number of bits used to specify it.
    int nColors = bmiHeader.biClrUsed ? bmiHeader.biClrUsed :
    1 << bmiHeader.biBitCount; LPVOID lpDIBBits;

    if( bmInfo.bmiHeader.biBitCount > 8 )
    lpDIBBits = (LPVOID)((LPDWORD)(bmInfo.bmiColors + bmInfo.bmiHeader.biClrUsed) +
    ((bmInfo.bmiHeader.biCompression == BI_BITFIELDS) ? 3 : 0));
    else
    lpDIBBits = (LPVOID)(bmInfo.bmiColors + nColors);

    // Create the logical palette
    if( pPal != NULL )
    { // Create the palette

    if( nColors <= 256 )
    {
    UINT nSize = sizeof(LOGPALETTE) + (sizeof(PALETTEENTRY) * nColors);
    LOGPALETTE *pLP = (LOGPALETTE *) new BYTE[nSize];
    pLP->palVersion = 0x300;
    pLP->palNumEntries = nColors;
    for( int i=0; i < nColors; i++)
    {
    pLP->palPalEntry[i].peRed = bmInfo.bmiColors[i].rgbRed;
    pLP->palPalEntry[i].peGreen = bmInfo.bmiColors[i].rgbGreen;
    pLP->palPalEntry[i].peBlue = bmInfo.bmiColors[i].rgbBlue;
    pLP->palPalEntry[i].peFlags = 0;
    }

    pPal->CreatePalette( pLP );

    delete[] pLP;
    }
    }
    CClientDC dc(NULL);
    CPalette* pOldPalette = NULL;
    if( pPal )
    { pOldPalette = dc.SelectPalette( pPal, FALSE );

    dc.RealizePalette();
    }
    HBITMAP hBmp = CreateDIBitmap( dc.m_hDC, // handle to device context
    &bmiHeader, // pointer to bitmap size and format data
    CBM_INIT, // initialization flag
    lpDIBBits, // pointer to initialization data
    &bmInfo, // pointer to bitmap color-format data
    DIB_RGB_COLORS); // color-data usage

    bitmap.Attach( hBmp );
    if( pOldPalette ) dc.SelectPalette( pOldPalette, FALSE );
    ::GlobalFree(hDIB);
    return TRUE;
    }

    And Try this to Draw it with one Transparent color:

    void CCISBitmap:rawTransparent(CDC * pDC, int x, int y, COLORREF crColour)
    {
    COLORREF crOldBack = pDC->SetBkColor(m_crWhite);
    COLORREF crOldText = pDC->SetTextColor(m_crBlack);
    CDC dcImage, dcTrans;

    // Create two memory dcs for the image and the mask
    dcImage.CreateCompatibleDC(pDC);
    dcTrans.CreateCompatibleDC(pDC);

    // Select the image into the appropriate dc
    CBitmap* pOldBitmapImage = dcImage.SelectObject(this);

    // Create the mask bitmap
    CBitmap bitmapTrans;
    int nWidth = Width();
    int nHeight = Height();
    bitmapTrans.CreateBitmap(nWidth, nHeight, 1, 1, NULL);

    // Select the mask bitmap into the appropriate dc
    CBitmap* pOldBitmapTrans = dcTrans.SelectObject(&bitmapTrans);

    // Build mask based on transparent colour
    dcImage.SetBkColor(crColour);
    dcTrans.BitBlt(0, 0, nWidth, nHeight, &dcImage, 0, 0, SRCCOPY);

    // Do the work - True Mask method - cool if not actual display
    pDC->BitBlt(x, y, nWidth, nHeight, &dcImage, 0, 0, SRCINVERT);
    pDC->BitBlt(x, y, nWidth, nHeight, &dcTrans, 0, 0, SRCAND);
    pDC->BitBlt(x, y, nWidth, nHeight, &dcImage, 0, 0, SRCINVERT);

    // Restore settings
    dcImage.SelectObject(pOldBitmapImage);
    dcTrans.SelectObject(pOldBitmapTrans);
    pDC->SetBkColor(crOldBack);
    pDC->SetTextColor(crOldText);
    }

    If you want to draw it just drawn look at the CDC Dokumentation in the MSDN.

    ÖÖÖÖÖ@OOOOOOOOOO00000000ooooooooooo°°°°°.... . . . . . . . . . .

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  





Click Here to Expand Forum to Full Width

Featured