64,642
社区成员
发帖
与我相关
我的任务
分享
void Cimage1Dlg::Display(int HWND,BITMAPINFO* pDisBmpInfo,BYTE* pDisBmpData)
{
//获得pictrue控件窗口的句柄
CWnd *pWnd;
pWnd=GetDlgItem(HWND);
//获取矩形
CRect rect;
pWnd->GetClientRect(&rect);//获得pictrue控件所在的矩形区域
//获取DC(设备描述表,跟窗口有关)
CDC *pDC;
pDC = pWnd->GetDC();//获得pictrue控件的DC
pDC->SetStretchBltMode(COLORONCOLOR);
StretchDIBits(pDC->GetSafeHdc(),0,0,rect.Width(),rect.Height(),0,0, pDisBmpInfo->bmiHeader.biWidth,pDisBmpInfo->bmiHeader.biHeight,pDisBmpData,pDisBmpInfo,DIB_RGB_COLORS,SRCCOPY);
}
//把bmpFile里的内容读取并写入*pBmpData
if (bmpFile.Read(pBmpData,dataBytes) != dataBytes)
{
AfxMessageBox("Read bmp data failed!");
delete pBmpInfo;
delete pBmpData;
return;
}
bmpFile.Close();
//至此,文件内容已经被存入pBmpInfo和pBmpData
Display(IDC_IMAGE,pBmpInfo,pBmpData);
//切换为关闭图片按钮
button_flag = 1;
SetDlgItemText(ID_OPEN,"关闭图片");
GetDlgItem(IDC_FIX1)->EnableWindow(TRUE);
}
else
{
//关闭图片按钮功能
delete[] pBmpInfo;
delete[] pBmpData;
dataBytes = 0;
pBmpInfo = NULL;
pBmpData = NULL;
this->RedrawWindow();
//切换为打开图片按钮
button_flag = 0;
SetDlgItemText(ID_OPEN,"打开图片");
GetDlgItem(IDC_FIX1)->EnableWindow(FALSE);
}
}
AfxMessageBox("invalid file type!");
return;
}
//读取信息头
if (bmpFile.Read(&bmpInfo,sizeof(BITMAPINFOHEADER)) != sizeof(BITMAPINFOHEADER))
{
AfxMessageBox("read bmp infor header failed!");
return;
}
//检测是否是24位真彩图
if (bmpInfo.biBitCount != 24)
{
AfxMessageBox("File is not 24 bit.Application doesn't support this kind of file!");
return;
}
//========================================================================
//动态开辟内存空间,存放信息头bmpInfo
pBmpInfo = (BITMAPINFO *)new char[sizeof(BITMAPINFOHEADER)];
if (!pBmpInfo)
{
AfxMessageBox("memory error!");
return;
}
//把bmpInfo中的信息拷贝到pBmpInfo所指向的空间中
memcpy(pBmpInfo,&bmpInfo,sizeof(BITMAPINFOHEADER));
//计算图像内容字节数
dataBytes = bmpHeader.bfSize - bmpHeader.bfOffBits;
//动态开辟内存空间,存放图像内容
pBmpData = (BYTE*)new char[dataBytes];
if (!pBmpData)
{
AfxMessageBox("memory error!");
delete pBmpData;
return;
}
//把bmpFile里的内容读取并写入*pBmpData
if (bmpFile.Read(pBmpData,
//全局图像指针
BITMAPINFO* pBmpInfo = NULL; //记录图像细节
BYTE* pBmpData = NULL; //图像数据
DWORD dataBytes; //图像字节数
//打开文件按钮
int button_flag = 0; //0:显示为打开图片,1:显示为关闭图片
void Cimage1Dlg::OnBnClickedOpen()
{
// TODO: 在此添加控件通知处理程序代码
// ID_OPEN
if(button_flag == 0)
{
//打开图片按钮功能
//记录选择文件路径
CString strFileName;
//记录打开文件
CFile bmpFile;
BITMAPFILEHEADER bmpHeader; //文件头
BITMAPINFOHEADER bmpInfo; //信息头
//打开文件
//CFileDialog为VC中打开文件对话框类
CFileDialog dlg(TRUE, "*.BMP", NULL, NULL,"位图文件(*.BMP)|*.bmp;*.BMP|",this);
if (!dlg.DoModal() == IDOK)
return;
//获取文件路径
strFileName = dlg.GetPathName();
//以只读的方式打开文件
//打开文件到bmpFile
if(!bmpFile.Open(strFileName, CFile::modeRead|CFile::typeBinary))
return;
//读取文件头
if (bmpFile.Read(&bmpHeader,sizeof(BITMAPFILEHEADER)) != sizeof(BITMAPFILEHEADER))
{
AfxMessageBox("read bmp header failed!");
return;
}
//检测文件类型是否为BMP
//0x424D = "BM"
if (bmpHeader.bfType != 0x4d42)
{