日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > c/c++ >内容正文

c/c++

VC MFC界面上显示BMP图片

發(fā)布時(shí)間:2025/3/21 c/c++ 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 VC MFC界面上显示BMP图片 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1、通過(guò)點(diǎn)擊界面瀏覽按鈕選擇BMP圖像文件。

點(diǎn)擊瀏覽按鈕打開(kāi)文件對(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ò),歡迎將生活随笔推薦給好友。