用File|Open打开一个bmp文件,显示在客户区
是不是有两中方法:1)用API函数loadimage和BitBlt函数
2)直接对bmp解码
请高手能不能把二种方法具体到细节都贴出来,有没有源程序(只关于bmp的)?
thx........

解决方案 »

  1.   

    1.
    显示磁盘上的外部BMP文件 

    HBITMAP bitmap; 
    /////读取位图文件SAMPLE.BMP 
    bitmap=(HBITMAP)LoadImage(AfxGetInstanceHandle(),"SAMPLE.BMP",IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION); 
    ASSERT(bitmap); 
    HBITMAP OldBitmap; 
    CDC MemDC;CRect rect; 
    MemDC.CreateCompatibleDC(&dc); 
    GetClientRect(rect); 
    OldBitmap=(HBITMAP)MemDC.SelectObject(bitmap); 
    ///显示它 
    dc.BitBlt(20,20,rect.Width()-20,rect.Height()-20,&MemDC,0,0,SRCCOPY); 
    MemDC.SelectObject(OldBitmap); 

      

  2.   

    HBITMAP hBitmap =(HBITMAP)::LoadImage (AfxGetInstanceHandle (),
                                  szPathName, IMAGE_BITMAP, 0, 0,
      LR_CREATEDIBSECTION|LR_LOADFROMFILE|LR_DEFAULTSIZE); ASSERT (hBitmap != NULL); m_pbmp = new CBitmap();
    //m_pbmp=CBitmap::FromHandle(hBitmap);
    m_pbmp->Attach (hBitmap);
    BITMAP bm;
    CDC dcMem; m_pbmp->GetObject(sizeof(bm),(LPVOID)&bm); dcMem.CreateCompatibleDC(pDC);
    CBitmap *pBmpOld=(CBitmap *)dcMem.SelectObject(m_pbmp); pDC->BitBlt(0,0,
    ,bm.bmWidth
    ,bm.bmWidth
    &dcMem,
    0,0,
    SRCCOPY); dcMem.SelectObject(pBmpOld);
      

  3.   

    先去了解一下bmp文件的格式
    他是由40bytes的文件头和图像文件组成DIB格式
    具体的可以找一个对bmp文件操作的例子
      

  4.   

    用File|Open可以打开任意个BMP文件,怎么做?
    这些语句放在OnDraw()中好像显示有问题?
      

  5.   

    这些语句放在那儿? OnDraw()中吗?
    还有,我是要用File|Open可以打开任意个bmp文件的?
      

  6.   

    源程序﹐如下。
    CString filename;
    CFileDialog dlg(TRUE,NULL,NULL,OFN_OVERWRITEPROMPT,"BMP(*.bmp)|*.bmp||",NULL);
    if(dlg.DoModal()==IDOK)
    {
    filename=dlg.GetPathName();
    }
    CFile file;
    if(!file.Open(filename,CFile::modeRead))
    {
    AfxMessageBox("can't open the file.");
    return;
    }
    CDC *pdc;
    pdc=GetDC();
        WORD bfType;
    DWORD bfSize;
    DWORD bfOffset;
    CRect rect;
     LPBITMAPINFO lpbi32bpp;
    GetClientRect(&rect);
    BITMAPINFOHEADER bm_header;
    file.Read(&bfType,sizeof(WORD));
    file.Read(&bfSize,sizeof(DWORD));
    file.Seek(2*sizeof(WORD),CFile::current);
    file.Read(&bfOffset,sizeof(DWORD));
    file.Seek(14,CFile::begin);
    file.Read(&bm_header,sizeof(BITMAPINFOHEADER));
    LPBYTE p_BMData,p_BMData1;
    p_BMData=(BYTE*)new BYTE[bfSize-bfOffset];//should use globalalloc()
        p_BMData1=(BYTE*)new BYTE[bfSize-bfOffset];
    file.Seek(bfOffset,CFile::begin);
    int m=bfSize-bfOffset;
    file.ReadHuge(p_BMData,bfSize-bfOffset);
    int count=0;
        lpbi32bpp=(LPBITMAPINFO)p_BMData;
        lpbi32bpp->bmiHeader.biBitCount=bm_header.biBitCount;
        lpbi32bpp->bmiHeader.biClrImportant=bm_header.biClrImportant;
    lpbi32bpp->bmiHeader.biClrUsed=bm_header.biClrUsed;
    lpbi32bpp->bmiHeader.biCompression=bm_header.biCompression;
    lpbi32bpp->bmiHeader.biHeight=bm_header.biHeight;
    lpbi32bpp->bmiHeader.biPlanes=bm_header.biPlanes;
    lpbi32bpp->bmiHeader.biSize=bm_header.biSize;
    lpbi32bpp->bmiHeader.biSizeImage=bm_header.biSizeImage;
    lpbi32bpp->bmiHeader.biWidth=bm_header.biWidth;
    lpbi32bpp->bmiHeader.biXPelsPerMeter=bm_header.biXPelsPerMeter;
    lpbi32bpp->bmiHeader.biYPelsPerMeter=bm_header.biYPelsPerMeter;
    for(;count<300;count++)
    {
    for(int i=0;i<m;i++)
    {
    p_BMData1[i]=p_BMData[i]* count/300;
        
    }

    SetDIBitsToDevice(pdc->m_hDC,
    20,
    20,
    bm_header.biWidth,
    bm_header.biHeight,
    0,
    0,
    0,
    bm_header.biHeight,
    p_BMData1,
    lpbi32bpp,
    DIB_RGB_COLORS);
    // Sleep(10);
    //ValidateRect(&rect);

    }
    for(;count>0;count--)
    {
           for(int i=0;i<m;i++)
    {
    p_BMData1[i]=p_BMData[i]* count/300;
       
    lpbi32bpp=(LPBITMAPINFO)p_BMData;
    lpbi32bpp->bmiHeader.biBitCount=bm_header.biBitCount;
    lpbi32bpp->bmiHeader.biClrImportant=bm_header.biClrImportant;
    lpbi32bpp->bmiHeader.biClrUsed=bm_header.biClrUsed;
    lpbi32bpp->bmiHeader.biCompression=bm_header.biCompression;
    lpbi32bpp->bmiHeader.biHeight=bm_header.biHeight;
    lpbi32bpp->bmiHeader.biPlanes=bm_header.biPlanes;
    lpbi32bpp->bmiHeader.biSize=bm_header.biSize;
    lpbi32bpp->bmiHeader.biSizeImage=bm_header.biSizeImage;
    lpbi32bpp->bmiHeader.biWidth=bm_header.biWidth;
    lpbi32bpp->bmiHeader.biXPelsPerMeter=bm_header.biXPelsPerMeter;
    lpbi32bpp->bmiHeader.biYPelsPerMeter=bm_header.biYPelsPerMeter;
    }

    SetDIBitsToDevice(pdc->m_hDC,
    20,
    20,
    bm_header.biWidth,
    bm_header.biHeight,
    0,
    0,
    0,
    bm_header.biHeight,
    p_BMData1,
    lpbi32bpp,
    DIB_RGB_COLORS);
             

    }
    delete p_BMData;
        delete p_BMData1;