动态显示BMP位图

截个图:

动态显示BMP位图_第1张图片

在函数中加入以下代码:

 

CFileDialog FileDlg(TRUE, "BMP", NULL, //定义文件对话框
OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, "位图文件(*.BMP)|*.BMP||");
if(FileDlg.DoModal() != IDOK) //打开文件对话框
return ;
CString pathname = FileDlg.GetPathName();//获取选中文件的路径
CFile file; //定义一个文件变量
if(!file.Open(pathname, CFile::modeRead) )//以制度的方式打开文件
return ;
DWORD FileLen = file.GetLength();//获取文件的长度
char *pBMPBuffer = new char[FileLen + 1];//开辟符数组
if(!pBMPBuffer) //如果控件不够大
return ;
if(file.ReadHuge(pBMPBuffer,FileLen) != FileLen)//读取文件保存在字符数组中
return ;
LPSTR hDIB,lpBuffer = pBMPBuffer;
LPVOID lpDIBBits;
BITMAPFILEHEADER bmfHeader;//保存bmp文件头的信息
DWORD bmfHeaderLen;//保存文件头的长度

bmfHeaderLen = sizeof(bmfHeader);//读取文件头的长度
strncpy((LPSTR)&bmfHeader,(LPSTR)lpBuffer,bmfHeaderLen);//文件的赋值
if (bmfHeader.bfType != (*(WORD*)"BM"))//如果文件类型不对
return ;
hDIB = lpBuffer + bmfHeaderLen; //将指针移动到文件头的后面
BITMAPINFOHEADER &bmiHeader = *(LPBITMAPINFOHEADER)hDIB ;//读取bmp文件的数据
BITMAPINFO &bmInfo = *(LPBITMAPINFO)hDIB ;
lpDIBBits=(lpBuffer)+((BITMAPFILEHEADER *)lpBuffer)->bfOffBits;
CClientDC dc(this);
m_hPhotoBitmap = CreateDIBitmap(dc.m_hDC,&bmiHeader,CBM_INIT,lpDIBBits,&bmInfo,DIB_RGB_COLORS);

 

CStatic *pStaic = (CStatic*)GetDlgItem(IDC_PHOTO);//获取ID为IDC_PHOTO控件的指针
CPaintDC dc(this); // device context for painting
CBitmap bmp; //定义位图变量
bmp.Attach(m_hPhotoBitmap); 
BITMAP bm; //定义一个位图结构
bmp.GetBitmap(&bm); 
CDC dcMem; 
dcMem.CreateCompatibleDC(GetDC()); //创建一个兼容的DC
CBitmap *poldBitmap=(CBitmap*)dcMem.SelectObject(bmp); //将位图选入设备环境类
CRect lRect; //定义一个区域
pStaic->GetClientRect(&lRect); //获取控件的客户区域
lRect.NormalizeRect(); 
pStaic->GetDC()->StretchBlt(lRect.left ,lRect.top ,lRect.Width(),lRect.Height(), 
&dcMem,0 ,0,bm.bmWidth,bm.bmHeight,SRCCOPY); //显示位图 
dcMem.SelectObject(&poldBitmap); //将原有的句柄选入设备环境


你可能感兴趣的:(动态显示BMP位图)