怎么读取和显示灰度bmp图片

如何读取和显示灰度bmp图片
建了一个单文档。要在哪些地方加代码,就能读取和显示灰度bmp的图片。
能具体点就万分感谢了!!

------解决方案--------------------
我曾经在这里写过。
很详细,因为我刚搞明白是怎么回事!
http://chendandantj.spaces.live.com/
------解决方案--------------------
BOOL CDibDoc::OnOpenDocument(LPCTSTR lpszPathName)
{
 CFile file;//定义一个文件类
 CFileException fe;//定义如果出错将进行如何处理
 if (!file.Open(lpszPathName, CFile::modeRead | CFile::shareDenyWrite, &fe))
 {
  AfxMessageBox( "文件打不开 ");//打开文件失败
  return FALSE;
  }
 DeleteContents();//删除文件中的内容
 BeginWaitCursor();//图表变成等待形状
 BITMAPFILEHEADER bmfHeader;//定义位图文件头
 DWORD dwBitsSize;//位图大小
 HANDLE hDIB;//位图句柄
 LPSTR pDIB;//指向位图的指针
 BITMAPINFOHEADER *bmhdr;//指向位图信息头的指针
 dwBitsSize = file.GetLength();//获取文件大小
 if (file.Read((LPSTR)&bmfHeader, sizeof(bmfHeader)) !=
             sizeof(bmfHeader))//检查读取到的文件头大小跟实际的是否相等
  return FALSE;//不等的话返回
  if (bmfHeader.bfType != 0x4d42) file://检查是否为BMP文件
   return FALSE;
   hDIB=(HANDLE) ::GlobalAlloc(GMEM_MOVEABLE |
                 GMEM_ZEROINIT, dwBitsSize);
   file://申请缓冲区
   if (hDIB == 0)
   {
    return FALSE;
   }
   pDIB = (LPSTR) ::GlobalLock((HGLOBAL)hDIB);
   file://得到申请的缓冲区的指针
   if (file.ReadHuge(pDIB, dwBitsSize - sizeof(BITMAPFILEHEADER)) !=
     dwBitsSize - sizeof(BITMAPFILEHEADER) )//判断读取到的(文件的总大小-文件头的大小)是否与实际的相等
   {
    ::GlobalUnlock((HGLOBAL)hDIB);//释放缓冲区
    hDIB=NULL;
    return FALSE;
    }//读数据,包括位图信息、位图颜色表、图像像素的灰度值
   bmhdr=(BITMAPINFOHEADER*)pDIB;//为指向位图信息头结构的指针付值
   ::GlobalUnlock((HGLOBAL)hDIB);
   if ((*bmhdr).biBitCount!=8) file://验证是否为8bit位图
    return FALSE;
    m_hDIB=hDIB;
    InitDIBData();
    file://自定义函数,根据读入的数据得到位图的宽、高、颜色表
    file:// 来得到初始化视的尺寸、生成调色板
    EndWaitCursor();
    SetPathName(lpszPathName);//设置存储路径
    SetModifiedFlag(FALSE); // 设置文件修改标志为FALSE
    return TRUE;
   }