資源描述:
《mfc對(duì)話框打開一幅圖片并在picture顯示和圖片保存》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在應(yīng)用文檔-天天文庫。
1、學(xué)了MFC一段時(shí)間后,試著要用對(duì)話框打開一幅bmp圖像并保存,結(jié)果發(fā)現(xiàn)網(wǎng)上這些資料太少了,而且有的也講不清,講不全,所以自己磕磕碰碰搗鼓了好久,期間也謝謝各位大神的指導(dǎo),現(xiàn)在我終于完成,特意寫出來與大家分享,各位菜鳥共勉。一、首先要先了解bmp位圖結(jié)構(gòu)http://wenku.baidu.com/view/d06c23543c1ec5da50e2706d.html可以去看看,內(nèi)容不多但是夠看,也容易懂二、了解位圖的顯示函數(shù)SetStretchBltMode()StretchDIBits()具體函數(shù)介紹自己百度一下,我就不多說了三、開始做啦1、新建一個(gè)MFC對(duì)話框文檔默
2、認(rèn)其他設(shè)置,點(diǎn)擊完成后會(huì)出現(xiàn)這個(gè)界面在按鈕上單擊鼠標(biāo)右鍵,在彈出的列表中選擇屬性把標(biāo)題改為讀取圖片再添加一個(gè)按鈕,把ID改為IDC_SAVE,標(biāo)題改為保存圖片在控件中選擇圖像,然后在對(duì)話框畫一個(gè)大小適宜的矩形框,在選中對(duì)話框點(diǎn)擊右鍵,選擇屬性,把ID改為IDC_PICTURE回到對(duì)話框界面,雙擊讀取圖片按鈕,這時(shí)會(huì)彈出一個(gè)對(duì)話框,點(diǎn)確定然后就會(huì)跳到關(guān)聯(lián)函數(shù)這邊了先把CDialog::OnOK();注釋起來,這個(gè)是點(diǎn)擊按鈕后對(duì)話框就會(huì)關(guān)閉的函數(shù)然后在//CDialog::OnOK();下面添加以下代碼代碼都有注釋,不懂的地方可以自己再百度//CFileDialog為VC
3、中打開文件對(duì)話框類BITMAPFILEHEADERbmpHeader;//文件頭BITMAPINFOHEADERbmpInfo;//信息頭CFileDialogdlg(TRUE,"*.BMP",NULL,NULL,"位圖文件(*.BMP)
4、*.bmp;*.BMP
5、",this);CFilebmpFile;//記錄打開文件CStringstrFileName;//記錄選擇文件路徑if(!dlg.DoModal()==IDOK)return;strFileName=dlg.GetPathName();//以只讀的方式打開文件if(!bmpFile.Open(strFile
6、Name,CFile::modeRead
7、CFile::typeBinary))return;if(bmpFile.Read(&bmpHeader,sizeof(BITMAPFILEHEADER))!=sizeof(BITMAPFILEHEADER)){AfxMessageBox("readbmpheaderfailed!");return;}if(bmpHeader.bfType!=0x4d42){AfxMessageBox("invalidfiletype!");return;}if(bmpFile.Read(&bmpInfo,sizeof(BITMAPINFOH
8、EADER))!=sizeof(BITMAPINFOHEADER)){AfxMessageBox("readbmpinforheaderfailed!");return;}if(bmpInfo.biBitCount!=24){AfxMessageBox("Fileisnot24bit.Applicationdoesn'tsupportthiskindoffile!");return;}pBmpInfo=(BITMAPINFO*)newchar[sizeof(BITMAPINFOHEADER)];if(!pBmpInfo){AfxMessageBox("memoryer
9、ror!");return;}//為圖像數(shù)據(jù)申請(qǐng)空間memcpy(pBmpInfo,&bmpInfo,sizeof(BITMAPINFOHEADER));DWORDdataBytes=bmpHeader.bfSize-bmpHeader.bfOffBits;pBmpData=(BYTE*)newchar[dataBytes];if(!pBmpData){AfxMessageBox("memoryerror!");deletepBmpData;return;}if(bmpFile.Read(pBmpData,dataBytes)!=dataBytes){AfxMessa
10、geBox("Readbmpdatafailed!");deletepBmpInfo;deletepBmpData;return;}bmpFile.Close();CWnd*pWnd=GetDlgItem(IDC_PICTURE);//獲得pictrue控件窗口的句柄CRectrect;pWnd->GetClientRect(&rect);//獲得pictrue控件所在的矩形區(qū)域CDC*pDC=pWnd->GetDC();//獲得pictrue控件的DC//顯示圖片pDC->SetStretchBltMode(COLORONCOLOR);Stretc