在MyDOC类中我这样写了,是参考书上的:
变量是这样的
public:
BITMAPFILEHEADER bf;
BITMAPINFOHEADER bi;
RGBQUAD* quad;
BYTE* lpBuf;
BITMAPINFO* pbi;
int flag;
int numQuad;意思都很清楚,不用注释了
void CNewDoc::OnFileOpen() 
{ char szFilter[]="bmp files(*.bmp)|*.bmp||";
CFileDialog dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY,szFilter);
CString filename;
CFile file;

if (dlg.DoModal()==IDOK)
{
   filename=dlg.GetPathName();
   if (file.Open(filename,CFile::modeRead|CFile::shareDenyNone,NULL)==0)
   {
      AfxMessageBox("无法打开 ",MB_OK,0);
  return;
   }    file.Read(&bf,sizeof(bf));
   if (bf.bfType!=0x4d42)
   {
      AfxMessageBox("非BMP文件",MB_OK,0);
  return;
   }    if (file.GetLength()!=bf.bfSize)
   {
      AfxMessageBox("文件损坏!",MB_OK,0);
  return;
   }    file.Read(&bi,sizeof(bi));    numQuad=0;
   if (bi.biBitCount<24)
   numQuad=1<<bi.biBitCount;    pbi=(BITMAPINFO*)HeapAlloc(GetProcessHeap(),0,sizeof      (BITMAPINFOHEADER+numQuad*sizeof(RGBQUAD));    memcpy(pbi,&bi,sizeof(bi));
   quad=(RGBQUAD*)(BYTE*)pbi+sizeof(BITMAPINFOHEADER);
   if(numQuad!=0)
   file.Read(quad,sizeof(RGBQUAD)*numQuad);
   
   bi.biSizeImage=bf.bfSize-bf.bfOffBits;
   lpBuf=(BYTE*)HeapAlloc(GetProcessHeap(),0,bi.biSizeImage);    file.Read(lpBuf,bi.biSizeImage);    file.Close();
   flag=1; }

}
上面的代码把图像的信息读入各变量中,现在在MyView类中用SetDIBitsToDevice怎么显示图片?
我写的显示代码是这样的,可是就是显示不了呀,请看一下是哪出错了:
void CNewView::OnDraw(CDC* pDC)
{
         CPaintDC dc(this);
CNewDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here if (pDoc->flag==1)
{
    
SetDIBitsToDevice(dc.m_hDC,
   0,
   0,
   pDoc->bi.biWidth,
   pDoc->bi.biHeight,
   0,
   0,
   0,
   pDoc->bi.biHeight,
   pDoc->lpBuf,
   pDoc->pbi,
   DIB_RGB_COLORS);
}
}到底是哪 出错了!!

解决方案 »

  1.   

    http://community.csdn.net/Expert/topic/4611/4611830.xml?temp=2.122134E-02我这里也使用了SetDIBitsToDevice,应该可以使用的。另外麻烦你帮我看看我的问题如何解决好么。谢谢了
      

  2.   

    BITMAPINFO *Bitmap;
    Bitmap=NULL;
    BITMAPINFOHEADER* pbfh;
    unsigned long Length; 
    m_VFWImageProc.CaptureDIB(&Bitmap,0,&Length); //这里是获得图象数据 pbfh=&(Bitmap->bmiHeader);
    this->bmpData=(char *)Bitmap;
    this->bmpData+=m_VFWImageProc.CalcBitmapInfoSize(*pbfh);

    int ret = 0;
    // Paint the image to the device.
    ret = SetDIBitsToDevice (
    dcSrc->m_hDC /*hdc*/,
    0/*x*/,
    0/*y*/,
    m_FrameX/*Width*/,
    m_FrameY/*Height*/,
    0,0,0,
    m_FrameY/*Height*/,
    (LPVOID)(bmpData),
    Bitmap/*pbmi*/,
    0);
    delete Bitmap;然后BITBLT一下应该可以了吧?
      

  3.   

    别的没看,不过CPaintDC dc(this);不要用在CView::OnDraw()中,请看CView::OnPaint()的代码。
      

  4.   

    大概看了一眼,SetDIBitsToDevice(dc.m_hDC,
       0,
       0,
       pDoc->bi.biWidth,
       pDoc->bi.biHeight,
       0,
       0,
       0,
       pDoc->bi.biHeight,
       pDoc->lpBuf,
       pDoc->pbi,
       DIB_RGB_COLORS);
    中的pDoc->pbi里面没有调色板信息(如果不是真彩色的话是画不出来的),你把读出来的调色板信息拷贝到pDoc->pbi的BITMAPINFOHEADER后再试试,
    我也有个类似的程序,看看能不能给你帮助,memcpy(GetPalette(),pal,min(GetPaletteSize(),bi.biClrUsed*sizeof(RGBQUAD)));
    if(8==wBitCount)
    {
    pal=(RGBQUAD*)calloc(256,sizeof(RGBQUAD));
    for (DWORD i=0; i<bi.biClrUsed; i++)
    {
    pal[i].rgbRed = pal[i].rgbGreen = pal[i].rgbBlue = (BYTE)(i*(255/(bi.biClrUsed-1)));

    }

    }
    /////////////////////////////////////////////////////////////////////////////////
    /*$功能:返回要创建的位图的大小$*/
    long CImage::GetSize()
    {
    return bi.biSize + GetPaletteSize();}
    /////////////////////////////////////////////////////////////////////////////////
    /*$功能:返回要创建的位图的调色板大小$*/
    DWORD CImage::GetPaletteSize()
    {
    return (bi.biClrUsed * sizeof(RGBQUAD));}
    /////////////////////////////////////////////////////////////////////////////////
    /*$功能:返回位图调色板的位置$*/
    RGBQUAD* CImage::GetPalette()
    {
    if ((pDib)&&(bi.biClrUsed))
    return (RGBQUAD*)((BYTE*)pDib + sizeof(BITMAPINFOHEADER));
    return NULL;}