文章目錄
- 1、用Picture控制項顯示圖片
- 2、用DC顯示圖片
- 3、控制項上顯示圖片
- 4、用com顯示圖片
顯示圖片匯總上一章總結了載入圖片的幾種方法,這章我總結一下顯示圖片的幾種常用方法,希望對各位有所協助1、用Picture控制項顯示圖片
1、首先添加Picture控制項,ID為IDC_IMG_BTM
2、定義 CBitmap* m_pBitmap;
3、匯入圖片,並定義ID為IDB_TEST_IMG
4、動態載入代碼如下:
CStatic* pImage = (CStatic*)GetDlgItem(IDC_IMG_BTM);
m_pBitmap = new CBitmap;
m_pBitmap->LoadBitmap(IDB_TEST_IMG);
pImage->SetBitmap(HBITMAP(*m_pBitmap));
5、最後別忘了delete m_pBitmap指標。
樣本(可更改圖片大小):
CStatic *mPicture = (CStatic *)GetDlgItem(pictureGroup1[i]); HICON hIcon = (HICON)::LoadImage(::AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_ICON_CHK), IMAGE_ICON, 16, 16, 0); mPicture->ModifyStyle(0x0,SS_ICON|SS_CENTERIMAGE); mPicture->SetIcon(hIcon);
2、用DC顯示圖片
//建立DC CClientDC dc(GetDlgItem(資源ID)); //擷取圖片內容 BITMAP bm; CBitmap* hbmp = CBitmap::FromHandle(LoadBitmap(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_BITMAP1)));hbmp->GetBitmap(&bm);CDC dcMem; //建立相容DC dcMem.CreateCompatibleDC(&dc); CBitmap *pOldBitmap=dcMem.SelectObject(hbmp); CRect lRect; //擷取Static控制項的大小範圍 m_bt_1.GetClientRect(&lRect); //在Static控制項上顯示位元影像 //判斷是否需要調整到適合畫布 dc.StretchBlt(lRect.left, lRect.top, lRect.Width()+100, lRect.Height()+100,&dcMem, 0, 0, bm.bmWidth, bm.bmHeight, SRCCOPY); dc.SelectObject(pOldBitmap);
3、控制項上顯示圖片
HBITMAP hbitmap; //將pStatic指向要顯示的地方 CStatic *pStatic = NULL; //根據ID擷取Static控制項 pStatic=(CStatic*)GetDlgItem(IDC_BUTTON1); //裝載資源*.bmp hbitmap=(HBITMAP)::LoadBitmap(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_BITMAP1)); CBitmap hbmp; hbmp.Attach(hbitmap); //擷取圖片內容 BITMAP bm; hbmp.GetBitmap(&bm); CDC dcMem; //建立相容DC dcMem.CreateCompatibleDC(GetDC()); CBitmap *pOldBitmap=(CBitmap*)dcMem.SelectObject(hbmp); CRect lRect; //擷取Static控制項的大小範圍 pStatic->GetClientRect(&lRect); //在Static控制項上顯示位元影像 pStatic->GetDC()->StretchBlt(lRect.left ,lRect.top ,lRect.Width(),lRect.Height(), &dcMem,0 ,0,bm.bmWidth,bm.bmHeight,SRCCOPY); dcMem.SelectObject(&pOldBitmap);
用這種方法可以在按鈕上繪製圖片
4、用com顯示圖片
#include<ocidl.h>#include<olectl.h>// lpstrFile:檔案名稱(最好是包含路徑在內) // hWnd // nScrWidth:輸出圖片的寬度 // nScrHeight:輸出圖片的高度 // nScrWidth、nScrHeight是輸出圖片的實際大小,換而言之是指縮放後的尺寸 HRESULT ShowPic(TCHAR *lpstrFile,HWND hWnd,int nScrWidth,int nScrHeight){HDC hDC_Temp=GetDC(hWnd);IPicture* pPic ;IStream* pStm ;BOOL bResult ;HANDLE hFile=NULL ;DWORD dwFileSize,dwByteRead ;//開啟硬碟中的圖形檔案 hFile=CreateFile(lpstrFile,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);if(hFile!=INVALID_HANDLE_VALUE){dwFileSize=GetFileSize(hFile,NULL);//擷取檔案位元組數 if(dwFileSize==0xFFFFFFFF)return E_FAIL ;}else {return E_FAIL ;}//分配全域儲存空間 HGLOBAL hGlobal=GlobalAlloc(GMEM_MOVEABLE,dwFileSize);LPVOID pvData=NULL ;if(hGlobal==NULL)return E_FAIL ;//鎖定分配記憶體塊 if((pvData=GlobalLock(hGlobal))==NULL)return E_FAIL ;ReadFile(hFile,pvData,dwFileSize,&dwByteRead,NULL);//把檔案讀入記憶體緩衝區 GlobalUnlock(hGlobal);CreateStreamOnHGlobal(hGlobal,TRUE,&pStm);//裝入圖形檔案 bResult=OleLoadPicture(pStm,dwFileSize,TRUE,IID_IPicture,(LPVOID*)&pPic);if(FAILED(bResult))return E_FAIL ;OLE_XSIZE_HIMETRIC hmWidth ;//圖片的真實寬度 OLE_YSIZE_HIMETRIC hmHeight ;//圖片的真實高度 pPic->get_Width(&hmWidth);pPic->get_Height(&hmHeight);if(hmWidth!=0) nScrHeight=(int)((long double)nScrWidth*hmHeight/hmWidth);//將圖形輸出到螢幕上(有點像BitBlt) bResult=pPic->Render(hDC_Temp,0,0,nScrWidth,nScrHeight,0,hmHeight,hmWidth,-hmHeight,NULL);pPic->Release();CloseHandle(hFile);//關閉開啟的檔案 if(SUCCEEDED(bResult)){return S_OK ;}else {return E_FAIL ;}}
這種方法有一個現成的封裝類,:http://download.csdn.net/detail/windows_nt/5567871
載入圖片匯總