用VB的picture控件顯示BMP、JPG、GIF很方便,但是在VC、MFC下卻不能直接顯示,於是我參考網上的例子寫了一個圖片顯示函數,希望能方便大家的使用。
Windows提供了一個顯示BMP、JPG、GIF的標準方法,你只需要實例化IPicture以及它的調用就可以,通過OleLoadPicture函數函數從流中讀取圖片並創建該圖片的IPicture對象:
OleLoadPicture(pStm,dwFileSize,TRUE,IID_IPicture,(LPVOID*)&pPic);
它在MSDN裏的定義如下:
STDAPI OleLoadPicture(
IStream * pStream,
//Pointer to the stream that contains picture's data
LONG lSize, //Number of bytes read from the stream
BOOL fRunmode,
//The opposite of the initial value of the picture's
// property
REFIID riid, //Reference to the identifier of the interface
// describing the type of interface pointer to return
VOID ppvObj //Address of output variable that receives interface
// pointer requested in riid
);
以下是顯示我在對話框CNewFormDlg中的一個圖像顯示函數DisplayPic,使用它可以在一個控件上顯示一幅圖片,該函數可以顯示BMP、JPG和GIF文件,參數如下:
char *lpImageFile 圖像文件名
HWND hWnd 要顯視對象句柄
int nScrWidth 顯示寬度
int nScrHeight 顯示高度
HRESULT CNewFormDlg::DisplayPic(char *lpImageFile, 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)
{
AfxMessageBox("圖形文件分配出錯.");
return E_FAIL;
}
if ((pvData = GlobalLock(hGlobal)) == NULL)//鎖定分配內存塊
{
AfxMessageBox("內存塊鎖定出問題");
return E_FAIL;
}
ReadFile(hFile,pvData,dwFileSize,&dwByteRead,NULL);//把文件讀入內存緩衝區
GlobalUnlock(hGlobal);
if(CreateStreamOnHGlobal(hGlobal, TRUE, &pStm) != S_OK)
{
AfxMessageBox("流初始化失敗");
return E_FAIL;
}
//裝入圖形文件
bResult=OleLoadPicture(pStm,dwFileSize,TRUE,IID_IPicture,(LPVOID*)&pPic);
if(FAILED(bResult))
{
AfxMessageBox("圖形文件裝載出錯.");
return E_FAIL;
}
OLE_XSIZE_HIMETRIC hmWidth;//圖片的真實寬度
OLE_YSIZE_HIMETRIC hmHeight;//圖片的真實高度
pPic->get_Width(&hmWidth);
pPic->get_Height(&hmHeight);
//將圖形輸出到屏幕上
bResult=pPic->Render(hDC_Temp,0,0,nScrWidth,nScrHeight,
0,hmHeight,hmWidth,-hmHeight,NULL);
CloseHandle(hFile);//關閉打開的文件
pPic->Release();
// Free memory.
GlobalFree(hGlobal);
if (SUCCEEDED(bResult))
{
return S_OK;
}
else
{
AfxMessageBox("圖形文件裝載出錯.");
return E_FAIL;
}
}
調用如下:
void CNewFormDlg::OnButton2()
{
HWND m_hWnd;
GetDlgItem(IDC_STATIC_VIEW,&m_hWnd);
DisplayPic("F://圖片//水晶//Crystal521.jpg",m_hWnd,500,500);
}