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

解决方案 »

  1.   

    CBitmap* m_pbmp;
    CDC* memDC,bmpDC;
    m_pbmp->LoadBitmap(......);
    OnDraw()中
    memDC=pDC->CreateCompatibleDC(pDC);
    m_pbmp->CreateCompatibleBitmap(memDC);
    pDC->Bitblt(......);
      

  2.   

    CDC MemDC;
    RECT wrect;
    MemDC.CreateCompatibleDC(pDC);
    GetClientRect(&wrect);
    HBITMAP bitmap;
    int cx=wrect.right-wrect.left;
    int cy=wrect.bottom-wrect.top;
    bitmap=(HBITMAP)LoadImage(AfxGetInstanceHandle(),"inte3.BMP",IMAGE_BITMAP,cx/10,cy/10,LR_LOADFROMFILE|LR_CREATEDIBSECTION);
    HBITMAP OldBitmap;
    OldBitmap=(HBITMAP)MemDC.SelectObject(bitmap);
    ///显示它
    // CSize size=bitmap
    pDC->BitBlt(0,0,cx,cy,&MemDC,0,0,SRCCOPY);
    MemDC.SelectObject(OldBitmap);
    其中inte3.bmp为bmp文件名,如不在当前目录下要有路径。pDC为CDC类。 
      

  3.   

    第一种方法很简单了,用LoadImage将指定的BMP调进来,然后用CreateCompatibleDC建立一个内存DC:memDC,用SelectObject将BMP赋给memDC,之后用BitBlt将memDC拷贝到程序DC中,就可以了。
    第二种方法也不难,主要用到BMP文件的结构,先自定义一下BMP的结构:
    //位图结构
    typedef struct BITMAP_FILE_TAG
    {
    BITMAPFILEHEADER BitFileHeader; //此变量包含位图文件的头
    BITMAPINFOHEADER BitInfoHeader; //所有的调色板的信息
    PALETTEENTRY     palette[256];  //我们将把调色板存到这里
    UCHAR         *buffer; //这是指向数据的指针 
    }BITMAP_FILE,*LPBITMAP_FILE;
    然后用OpenFile打开文件,_lread读进文件信息。最后用memcpy将文件拷贝到内存中就OK了。
      

  4.   

    用File|Open打开一个任意个bmp文件?怎么做?
    还有,这些函数放在那个函数中?
      

  5.   

    CFileDialog dlg( TRUE, "BMP", NULL, 
    OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, 
    "BMP File|*.bmp||", this);
    domodal后
    dlg.GetPathName();返回所选文件路径
      

  6.   

    dlg放在OnOpenFile中吗?
    那么loadimage放在那儿?
    bitblt放在那儿?
    有没有源程序发给我: [email protected]
    <a href="mailto:[email protected]">[email protected]</a>
    thx.......
      

  7.   

    CFileDialog fdlg(true,NULL, NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,"BMP(*.BMP)|*.BMP",NULL );
    if(fdlg.DoModal()==IDOK)
    {
    BITMAP bmp;
    CClientDC dc(this);
    CString FileName=fdlg.GetFileName();
    HBITMAP  m_hDisplay= (HBITMAP)LoadImage(AfxGetInstanceHandle(),FileName,IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION|LR_DEFAULTSIZE);
    GetObject(m_hDisplay,sizeof(bmp),&bmp);
    CDC MemDC;
    MemDC.CreateCompatibleDC(NULL);
    HBITMAP hold=(HBITMAP)MemDC.SelectObject(m_hDisplay);
    dc.BitBlt(0,0,bmp.bmWidth,bmp.bmHeight,&MemDC,0,0,SRCCOPY);
    MemDC.SelectObject(hold);
    DeleteDC(MemDC);
    DeleteDC(dc); }
      

  8.   

    关于第二种方法我比较认同hotyoung(风间月)的做法,在读取文件的过程中需要注意的问题是位图有8位,16位,24位,32位等等区别,不同的位图格式处理方法不一样,有的有调色板,有的有alpha,分别对待
      

  9.   

    我是在void CApp2Doc::OnFileOpen()中用的
    但是CClientDC dc(this)有错误:D:\Application\Microsoft Visual Studio\MyProjects\App2\App2Doc.cpp(108) : error C2664: 'CClientDC::CClientDC' : cannot convert parameter 1 from 'class CApp2Doc *const ' to 'class CWnd *'
      

  10.   

    CApp2Doc* pDoc = GetDocument();
    把 dc.BitBlt(0,0,bmp.bmWidth,bmp.bmHeight,&MemDC,0,0,SRCCOPY);
    MemDC.SelectObject(hold);
    pDoc->BitBlt(0,0,bmp.bmWidth,bmp.bmHeight,&MemDC,0,0,SRCCOPY);
    MemDC.SelectObject(hold);
    DeleteDC(MemDC);
    DeleteDC(dc);
      

  11.   

    不行,你能不能把能通过编译和连接的源程序发到
    谢了!
    D:\Application\Microsoft Visual Studio\MyProjects\App2\App2Doc.cpp(117) : error C2039: 'BitBlt' : is not a member of 'CApp2Doc'
      

  12.   

    HDC   dc, sdc, ddc;
    HBITMAP logo= LoadBitmap(hInstance, MAKEINTRESOURCE(ID_LOGO));
    dc = GetDC(hwnd);HBITMAP bottom = CreateCompatibleBitmap(dc, 256, 115);
    sdc = CreateCompatibleDC(dc);
    SelectObject(sdc, logo);
    ddc = CreateCompatibleDC(dc);
    SelectObject(ddc, logo);
    for(i=0; i < 256; i++) 
    {
    BitBlt(ddc, i, 0, 1, 115, sdc, 200, 260, SRCCOPY);
    }ReleaseDC(hwnd, dc);
    DeleteDC(sdc);
    DeleteDC(ddc);
      

  13.   

    不行,能不能把能通过的源程序发给我: [email protected]
    bitblt不是pDoc的成员函数