CFileDialog dlg(TRUE,"bmp",".bmp",OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,"位图文件(*.BMP)|*.BMP||");

if(dlg.DoModal()==IDOK)
{
CWnd*pWnd = GetDlgItem(IDC_PIC);
pDesDC = pWnd->GetDC();
memDC.CreateCompatibleDC(pDesDC);
bitmap.LoadBitmap(strFileName);

BITMAP bm;
GetObject(bitmap, sizeof BITMAP, &bm);
memDC.SelectObject(&bitmap);
CRect rect;
pWnd->GetClientRect(&rect);
pDesDC->SetStretchBltMode(COLORONCOLOR);       
// pDesDC->StretchBlt(rect.left, rect.top, rect.right, rect.bottom, &memDC, 0, 0, bm.bmWidth, bm.bmHeight,+SRCCOPY);
pDesDC->BitBlt(rect.left, rect.top, rect.right, rect.bottom, &memDC,  bm.bmWidth, bm.bmHeight,+SRCCOPY);
}
上面这一段代码有什么错,为什么不能显示位图,就是闪一下的情况也没有啊!

解决方案 »

  1.   

    你好象把位图的两个显示方法给混合在一起用了,
    一种是:loadbitmap()将位图直接装入内存,用selectobject()选入,用bitblt()画出;
    另一种:从*.bmp文件读入,需用CFile类的read()函数,读出*.bmp的头来,再在view中显示它,
      

  2.   

    各位大侠能说详细一点吗?我试过用bitbit的,可是好像也没有反应啊!
      

  3.   

    你这样不是只画了一次吗?
    你要在OnPaint或者OnDraw里画啊,打开的时候Load位图,保存位图在画的时候SelectObject
      

  4.   

    检查一下bitmap.LoadBitmap(strFileName);
    有没有成功。另外,pDesDC->SetStretchBltMode(COLORONCOLOR);
    有些多余。
      

  5.   

    LoadBitmap不能用来装载位图文件
    应该用LoadImagehBitmap = (HBITMAP)LoadImage(NULL, dlg.GetFileName(), IMAGE_BITMAP,
    0, 0, LR_LOADFROMFILE);
    然后用
    pBmp->Attach(hBitmap);再显示就可以了用了StretchBlt就不用BitBlt
      

  6.   

    看一看我的你就知道为什么不能了void CTestDoc::OnOpen() 
    {
    // TODO: Add your command handler code here ////////////////////////////////////////////////////
    //////以下是头文件中定义的///////////////////////////////
    /*
    HANDLE hdib;      
    HBITMAP hbitmap;
    CBitmap*  cbitmap;    //定义位图类指针
    LPBYTE datadib;
        */
    //////以上是头文件中定义的///////////////////////////////
        ////////////////////////////////////////////////////     CFileDialog dia(100);  //定义文件对话框类对象  CFile  file;
     LPBITMAPFILEHEADER fhead;
     LPBITMAPINFOHEADER lphdib;  //定义位图信息头结构变量
     LPBITMAPINFO lpdib;
     int numcolor;     //用来存储像素的位数
     HANDLE dib,hdata;
     
     CString str1,str2;
     //从堆中分配明确的字节数
     hdib=GlobalAlloc(GMEM_MOVEABLE,(DWORD)(sizeof(BITMAPINFOHEADER)+256*sizeof(RGBQUAD)));
         //打开队列的索引句柄
     HANDLE hfil=GlobalAlloc(GMEM_MOVEABLE,(DWORD)(sizeof(BITMAPFILEHEADER)));

     //锁住全局内存对象,并返回指向第一个字节内存的指针
     fhead=(LPBITMAPFILEHEADER)GlobalLock(hfil);
     if(dia.DoModal()==IDOK)
     {
     file.Open(dia.GetFileName(),0);
     file.Read(fhead,sizeof(BITMAPFILEHEADER));
      
             //锁住全局内存对象,并返回指向第一个字节内存的指针
     lphdib=(LPBITMAPINFOHEADER)GlobalLock(hdib);
     file.Read(lphdib,sizeof(BITMAPINFOHEADER));


     //16位无符号整型   得到每个像素的位数
             WORD  wbitcount=((LPBITMAPINFOHEADER)lphdib)->biBitCount;       switch(wbitcount)
     {
     case 1:
     numcolor=2;break;
         case 4:
         numcolor=16;break;
         case 8:
         numcolor=256;break;
         default:
         numcolor=0;
     }          dib=GlobalAlloc(GMEM_MOVEABLE,(DWORD)(sizeof(BITMAPINFOHEADER)+numcolor*sizeof(RGBQUAD)));
             lpdib=(LPBITMAPINFO)GlobalLock(dib);
         //搜索指向当前文件的指针(设置文件的指针值到文件的开头)
         file.SeekToBegin();

     //在当前文件位置读取文件数据
     //第一个参数:指向从文件获取数据提供给用户的缓冲区
     //第二个参数:从文件读取的最大位元数
         file.Read(fhead,sizeof(BITMAPFILEHEADER));         file.Read(lpdib,sizeof(BITMAPINFOHEADER)+numcolor*sizeof(RGBQUAD));
             if(numcolor==0)  
     //图象大小(字节数)         位图的宽度(像素) 位图的高度(像素)    每个像素的位数
         lpdib->bmiHeader.biSizeImage=3*lphdib->biWidth*lphdib->biHeight*24/lphdib->biBitCount;
     
     //分辨率即每个像素的位数
         str1.Format("图片大小%d k   分辨率 %d",lpdib->bmiHeader.biSizeImage/1024,lpdib->bmiHeader.biBitCount);
             AfxMessageBox(str1);
        
             hdata=GlobalAlloc(GMEM_MOVEABLE,(DWORD)(lpdib->bmiHeader.biSizeImage));
         datadib=(LPBYTE)GlobalLock(hdata);
            
         file.Read(datadib,lpdib->bmiHeader.biSizeImage);
              hdibtohbitmap( lphdib, datadib);

             CMainFrame* pmain = (CMainFrame*)AfxGetMainWnd();
     CTestView* pView=(CTestView*)pmain->GetActiveFrame()->GetActiveView();
     pView->OnShowView(); //调用视图类的OnShowView()函数
    }

    }
    void CTestView::OnShowView()
    {
    CClientDC dc(this);
    OnPrepareDC(&dc);

    CTestDoc* pDoc=GetDocument();
    ASSERT_VALID(pDoc);
    CClientDC  show(this);   // Constructs a CClientDC object connected to the CWnd. 
    CDC        pdc;  //定义设备上下文本对象
    pDoc->cbitmap=new CBitmap;   //动态创建位图类并把值赋给文档类存储位图的指针
        //Attaches a Windows GDI object to a CGdiObject object.
    pDoc->cbitmap->Attach(pDoc->hbitmap);//调用CBitmap类的Attach函数调入DDB位图
    pdc.CreateCompatibleDC(&show);
    /*
    This function may return a pointer to a temporary object. 
    This temporary object is only valid during the processing of one Windows message. 
    For more information, see CGdiObject::FromHandle
    */
    pdc.SelectObject(pDoc->cbitmap);    //显示图象
    show.BitBlt(0,0,2400,1400,&pdc,0,0,SRCCOPY);
    DeleteDC(pdc);   //删除当前设备文本上下文对象}
    自己仔细分析一下