资源描述:
《MFC实现bmp图片的打开和保存》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、郑海波MFC编程总结2011‐10‐3北京打开一幅图片1.新建一个多文档的MFC应用程序.2.在_Doc.h文件的C_Doc类中增加如下成员变量;public:intnumquad;//调色板数intflagOpen;//标志是否打开bmpBITMAPINFO*pbi;//记录图像细节BYTE*lpbuf;//图像数据RGBQUAD*quad;//调色板BITMAPFILEHEADERbf;//文件头BITMAPINFOHEADERbi;//信息头3.修改”打开”菜单项的响应函数;a.找到菜单资源b.在”打开”菜单项建立类向导,页面设置
2、如下:选择“Addfunction”,然后单击“EditCode”第1页郑海波MFC编程总结2011‐10‐3北京编辑代码如下:voidCZhbDoc::OnFileOpen(){//TODO:AddyourcommandhandlercodehereLPCTSTRlpszFilter="BMPFiles(*.bmp)
3、*.bmp
4、任何文件
5、*.*
6、
7、";CFileDialogdlg(TRUE,lpszFilter,NULL,OFN_HIDEREADONLY
8、OFN_OVERWRITEPROMPT,lpszFilter,NULL);CS
9、tringfilepath;CFilefile;//打开文件对话框if(dlg.DoModal()==IDOK){filepath=dlg.GetPathName();if(file.Open(filepath,CFile::modeRead
10、CFile::shareDenyNone,NULL)==0){//读取文件失败AfxMessageBox("无法打开文件!",MB_OK,0);return;}//读取文件头file.Read(&bf,sizeof(bf));//判断是否是BMP文件if(bf.bfType!=0x4d42)//'
11、BM'{AfxMessageBox("非BMP文件!",MB_OK,0);return;}//判断文件是否损坏if(file.GetLength()!=bf.bfSize){AfxMessageBox("文件已损坏,请检查!",MB_OK,0);return;}//读文件信息头file.Read(&bi,sizeof(bi));//计算调色板数目numquad=0;if(bi.biBitCount<24){numquad=1<12、i=(BITMAPINFO*)HeapAlloc(GetProcessHeap(),0,sizeof(BITMAPINFOHEADER)+numquad*sizeof(RGBQUAD));memcpy(pbi,&bi,sizeof(bi));quad=(RGBQUAD*)((BYTE*)pbi+sizeof(BITMAPINFOHEADER));//读取调色板if(numquad!=0){file.Read(quad,sizeof(RGBQUAD)*numquad);}//为图像数据申请空间bi.biSizeImage=bf.bfSiz
13、e‐bf.bfOffBits;lpbuf=(BYTE*)HeapAlloc(GetProcessHeap(),0,bi.biSizeImage);//读取图像数据file.Read(lpbuf,bi.biSizeImage);//图像读取完毕,关闭文件,设置标志file.Close();flagOpen=1;}}4.在C_Veiw类中增加paint消息处理函数;a.如下图:第3页郑海波MFC编程总结2011‐10‐3北京点击“addhandler”,然后再点“editexisting”c.在处理函数里编写如下代码:voidCZhbVie
14、w::OnPaint(){CPaintDCdc(this);//devicecontextforpainting//TODO:AddyourmessagehandlercodehereCZhbDoc*pDoc=GetDocument();//得到文档指针,注意,文档的命名是与工程名有关的!!不同的程序不一样.ASSERT_VALID(pDoc);//是否已打开某个BMP文件if(pDoc‐>flagOpen==1){//这个函数显示DIBSetDIBitsToDevice(dc.m_hDC,//DIB将输出的设备描述表0,//设备描述表
15、中位图输出起始逻辑x地址0,//设备描述表中位图输出起始逻辑x地址pDoc‐>bi.biWidth,//DIB的宽度pDoc‐>bi.biHeight,//DIB的高度0,//DIB开始读取输出的像素数据的