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);
}
上面这一段代码有什么错,为什么不能显示位图,就是闪一下的情况也没有啊!
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);
}
上面这一段代码有什么错,为什么不能显示位图,就是闪一下的情况也没有啊!
一种是:loadbitmap()将位图直接装入内存,用selectobject()选入,用bitblt()画出;
另一种:从*.bmp文件读入,需用CFile类的read()函数,读出*.bmp的头来,再在view中显示它,
你要在OnPaint或者OnDraw里画啊,打开的时候Load位图,保存位图在画的时候SelectObject
有没有成功。另外,pDesDC->SetStretchBltMode(COLORONCOLOR);
有些多余。
应该用LoadImagehBitmap = (HBITMAP)LoadImage(NULL, dlg.GetFileName(), IMAGE_BITMAP,
0, 0, LR_LOADFROMFILE);
然后用
pBmp->Attach(hBitmap);再显示就可以了用了StretchBlt就不用BitBlt
{
// 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); //删除当前设备文本上下文对象}
自己仔细分析一下