BOOL CBmpDlg::LoadBitmapFile(CString strFileName,CBitmap& bmp)
{
CFile file;
if( !file.Open(strFileName, CFile::modeRead) )
return FALSE; BITMAPFILEHEADER bmfHeader;
long nFileLen; nFileLen = file.GetLength(); if (file.Read((LPSTR)&bmfHeader, sizeof(bmfHeader)) != sizeof(bmfHeader))
return FALSE; if (bmfHeader.bfType != ((WORD)('M' <<8) | 'B'))
return FALSE; HGLOBAL hDIB = ::GlobalAlloc(GMEM_FIXED, nFileLen);////////////这句什么意思?完全不懂!!
if (hDIB == 0)
return FALSE; if (file.ReadHuge((LPSTR)hDIB, nFileLen - sizeof(BITMAPFILEHEADER)) !=
nFileLen - sizeof(BITMAPFILEHEADER) )
{
::GlobalFree(hDIB);
return FALSE;
} BITMAPINFO &bmInfo = *(LPBITMAPINFO) ::GlobalLock(hDIB) ;
BITMAPINFOHEADER *pInfoHead = (BITMAPINFOHEADER *)hDIB; int nHeaderSize=sizeof(BITMAPINFOHEADER);
BYTE *pBmpPixelBuffer=(BYTE *)&bmInfo+bmfHeader.bfOffBits - sizeof(BITMAPFILEHEADER); CDC dc;
dc.CreateDC("DISPLAY",NULL,NULL,NULL);
HBITMAP hBitmap;
hBitmap=CreateDIBitmap(dc.m_hDC,(BITMAPINFOHEADER *)&bmInfo,CBM_INIT,(VOID *)pBmpPixelBuffer,&bmInfo,DIB_RGB_COLORS);
bmp.Attach (hBitmap);

::GlobalUnlock (hDIB);
::GlobalFree(hDIB);
return TRUE;
}

解决方案 »

  1.   

    你不会查查GlobalAlloc的函数说明?
      

  2.   

    呵呵是啊,自己动手查查MSDN就知道用法了,::GlobalAlloc(GMEM_FIXED, nFileLen);一个常用的windowsAPI
      

  3.   

    那个HGLOBAL什么意思啊?还有HBITMAP
    我知道global、bitmap
      

  4.   

    具体点就是:Bitmap、CBbitmap和HBitmap的区别?
      

  5.   

    Bitmap位图,一个名词。
    CBitmap(not CBbitmap)位图类,一个MFC类。
    HBITMAP(不是HBitmap)位图资源句柄,CBitmap分装了位图句柄。
      

  6.   

    bmfHeader.bfType != ((WORD)('M' <<8) | 'B'
    是什么意思?为什么要'M'<<8??
      

  7.   

    hBitmap=CreateDIBitmap(dc.m_hDC,(BITMAPINFOHEADER *)&bmInfo,CBM_INIT,(VOID *)pBmpPixelBuffer,&bmInfo,DIB_RGB_COLORS);
    哪位大虾给讲解一下??
      

  8.   

    >>bmfHeader.bfType != ((WORD)('M' <<8) | 'B'
    >>是什么意思?为什么要'M'<<8??
    因为要判断位图的标志符号“BM",读取的是一个WORD,因此低地址存低字节'B',高8位地址存高字节'M'
      

  9.   

    >>hBitmap=CreateDIBitmap(dc.m_hDC,(BITMAPINFOHEADER *)&bmInfo,CBM_INIT,(VOID *)pBmpPixelBuffer,&bmInfo,DIB_RGB_COLORS);
    这是用指定设备创建dib位图,bmInfo是位图头信息,具体信息参考MSDN,pBmpPixelBuffer是位图二维象素数组数据。
    HBITMAP CreateDIBitmap(
      HDC hdc,                        // handle to DC
      CONST BITMAPINFOHEADER *lpbmih, // bitmap data
      DWORD fdwInit,                  // initialization option
      CONST VOID *lpbInit,            // initialization data
      CONST BITMAPINFO *lpbmi,        // color-format data
      UINT fuUsage                    // color-data usage
    );
      

  10.   

    HGLOBAL hDIB = ::GlobalAlloc(GMEM_FIXED, nFileLen);////////////申请一段共享内存块 就是剪切板