生活随笔
收集整理的這篇文章主要介紹了
VC MFC界面上显示BMP图片
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
1、通過(guò)點(diǎn)擊界面瀏覽按鈕選擇BMP圖像文件。
點(diǎn)擊瀏覽按鈕打開文件對(duì)話框選擇BMP圖像文件,得到文件所在的路徑目錄。關(guān)鍵代碼如下:
void?ShowBMPDlg::OnButtonSelectiamge()??{?????char??szFilter[]?=?"BMP?Files?(*.bmp)|*.bmp|All?Files(*.*)|*.*||";?????CFileDialog?dlg(?TRUE,"BMP",NULL,OFN_HIDEREADONLY?|?OFN_OVERWRITEPROMPT,szFilter?);?????if(dlg.DoModal()?==?IDOK)?????{?????????strPathName?=?dlg.GetPathName();?????????????????LoadShowBMPFile(strPathName);?????????????m_hBitmap?=?BufferToHBITMAP();?????????????Invalidate();?????}?}?
2、加載BMP文件到內(nèi)存
通過(guò)得到的BMP圖像文件路徑目錄,加載BMP圖像文件到內(nèi)存中。關(guān)鍵代碼如下:
BOOL?ShowBMPDlg::LoadShowBMPFile(const?char?*pPathname)?{?????CFile?file;?????if(?!file.Open(?pPathname,?CFile::modeRead)?)?????????return?FALSE;?????DWORD??m_nFileLen;?????m_nFileLen?=?file.GetLength();?????m_pBMPBuffer?=?new?char[m_nFileLen?+?1];?????if(!m_pBMPBuffer)?????????return?FALSE;?????if(file.Read(m_pBMPBuffer,m_nFileLen)?!=?m_nFileLen)?????????return?FALSE;?????return?TRUE;?}?
3、將內(nèi)存中的BMP文件內(nèi)容轉(zhuǎn)換到HBITMAP
將內(nèi)存中的BMP文件內(nèi)容轉(zhuǎn)換成位圖句柄。關(guān)鍵代碼如下:
HBITMAP?ShowBMPDlg::BufferToHBITMAP()?{?????HBITMAP????????????????hShowBMP;?????LPSTR????????????????hDIB,lpBuffer?=?m_pBMPBuffer;?????LPVOID????????????????lpDIBBits;?????BITMAPFILEHEADER????bmfHeader;?????DWORD????????????????bmfHeaderLen;??????????bmfHeaderLen?=?sizeof(bmfHeader);?????strncpy((LPSTR)&bmfHeader,(LPSTR)lpBuffer,bmfHeaderLen);?????if?(bmfHeader.bfType?!=?(*(WORD*)"BM"))?return?NULL;?????hDIB?=?lpBuffer?+?bmfHeaderLen;?????BITMAPINFOHEADER?&bmiHeader?=?*(LPBITMAPINFOHEADER)hDIB?;?????BITMAPINFO?&bmInfo?=?*(LPBITMAPINFO)hDIB?;?????m_bmW?=?bmiHeader.biWidth;?????m_bmH?=?bmiHeader.biHeight;?????lpDIBBits=(lpBuffer)+((BITMAPFILEHEADER?*)lpBuffer)->bfOffBits;?????CClientDC?dc(this);?????hShowBMP?=?CreateDIBitmap(dc.m_hDC,&bmiHeader,CBM_INIT,lpDIBBits,&bmInfo,DIB_RGB_COLORS);?????return?hShowBMP;?}?
4、在屏幕上顯示BMP圖像
雙緩沖實(shí)現(xiàn)BMP位圖顯示在屏幕上。關(guān)鍵代碼如下:
void?ShowBMPDlg::DrawImage(int?x,?int?y,?CDC?*pDC)?{?????HBITMAP?OldBitmap;?????CDC?MemDC;?????MemDC.CreateCompatibleDC(pDC);?????OldBitmap=(HBITMAP)MemDC.SelectObject(m_hBitmap);?????CBitmap*?pBitmap?=?CBitmap::FromHandle(m_hBitmap);?????if(m_bmW?==?0?||?m_bmH?==?0)?????????return?;?????CRect?rect;?????GetClientRect(&rect);?????????pDC->BitBlt(x,y,rect.Width(),rect.Height(),&MemDC,0,0,SRCCOPY);?????MemDC.SelectObject(OldBitmap);?}?
?
這個(gè)方法是我們經(jīng)常用的用來(lái)在界面上畫圖的一種方法。
?
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀
總結(jié)
以上是生活随笔為你收集整理的VC MFC界面上显示BMP图片的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。