位图的操作! 使用现成的类就可以了CBitmap

解决方案 »

  1.   

    建议查看MSDN例子程序ViewDIB,写得很好
      

  2.   

    // LoadBMP - Loads a BMP file and creates a logical palette for it.
    // Returns - TRUE for success
    // sBMPFile - Full path of the BMP file
    // phDIB - Pointer to a HGLOBAL variable to hold the loaded bitmap
    //   Memory is allocated by this function but should be 
    //   released by the caller.
    // pPal - Will hold the logical palette
    BOOL LoadBMP( LPCTSTR sBMPFile, HGLOBAL *phDIB, CPalette *pPal )
    {
    CFile file;
    if( !file.Open( sBMPFile, CFile::modeRead) )
    return FALSE; BITMAPFILEHEADER bmfHeader;
    long nFileLen; nFileLen = file.GetLength();
    // 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; HGLOBAL hDIB = ::GlobalAlloc(GMEM_FIXED, nFileLen);
    if (hDIB == 0)
    return FALSE; // Read the remainder of the bitmap file.
    if (file.ReadHuge((LPSTR)hDIB, nFileLen - sizeof(BITMAPFILEHEADER)) !=
    nFileLen - sizeof(BITMAPFILEHEADER) )
    {
    ::GlobalFree(hDIB);
    return FALSE;
    }

    BITMAPINFO &bmInfo = *(LPBITMAPINFO)hDIB ; int nColors = bmInfo.bmiHeader.biClrUsed ? bmInfo.bmiHeader.biClrUsed : 
    1 << bmInfo.bmiHeader.biBitCount; // Create the palette
    if( nColors <= 256 ) { UINT nSize="<font" color="#0000ff">sizeof(LOGPALETTE) + (sizeof(PALETTEENTRY) * nColors);
    LOGPALETTE *pLP = (LOGPALETTE *) new BYTE[nSize]; pLP->palVersion = 0x300;
    pLP->palNumEntries = nColors; for( int i=0; i 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;
    } *phDIB = hDIB;
    return TRUE;
    }void DrawDIB( CDC* pDC, HGLOBAL hDIB, CPalette *pPal )
    {
    LPVOID lpDIBBits; // Pointer to DIB bits
    BOOL bSuccess=FALSE;  // Success/fail flag BITMAPINFO &bmInfo = *(LPBITMAPINFO)hDIB ;
    int nColors = bmInfo.bmiHeader.biClrUsed ? bmInfo.bmiHeader.biClrUsed : 
    1 << bmInfo.bmiHeader.biBitCount; 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);

    if( pPal && (pDC->GetDeviceCaps(RASTERCAPS) & RC_PALETTE) )
    {
    pDC->SelectPalette(pPal, FALSE);
    pDC->RealizePalette();
    } ::SetDIBitsToDevice(pDC->m_hDC,  // hDC
       0, // DestX
       0, // DestY
       bmInfo.bmiHeader.biWidth, // nDestWidth
       bmInfo.bmiHeader.biHeight, // nDestHeight
       0, // SrcX
       0, // SrcY
       0, // nStartScan
       bmInfo.bmiHeader.biHeight, // nNumScans
       lpDIBBits, // lpBits
       (LPBITMAPINFO)hDIB, // lpBitsInfo
       DIB_RGB_COLORS);  // wUsage
    }用的是
    sdk