{
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)
{
CloseHandle(hFile);
return E_FAIL;
}
}
else
{
return E_FAIL;
}
//分配全局存儲空間
HGLOBAL hGlobal=GlobalAlloc(GMEM_MOVEABLE,dwFileSize);
if(hGlobal==NULL)
return E_FAIL;
LPVOID pvData =GlobalLock(hGlobal);
if(pvData==NULL)//鎖定分配內存塊
{
GlobalFree(hGlobal);
return E_FAIL;
}
ReadFile(hFile,pvData,dwFileSize,&dwByteRead,NULL);//把文件讀入內存緩衝區
CloseHandle(hFile);//關閉打開的文件
GlobalUnlock(hGlobal);
CreateStreamOnHGlobal(hGlobal,TRUE,&pStm);
//裝入圖形文件
bResult=OleLoadPicture(pStm,dwFileSize,TRUE,IID_IPicture,(LPVOID*)&pPic);
GlobalFree(hGlobal);
if(FAILED(bResult))
return E_FAIL;
long hmWidth;//圖片的真實寬度
long hmHeight;//圖片的真實高度
pPic->get_Width(&hmWidth);
pPic->get_Height(&hmHeight);
//將圖形輸出到屏幕上(有點像BitBlt)
bResult=pPic->Render(pDC->m_hDC,x,y,nScrWidth,nScrHeight,0,hmHeight,hmWidth,-hmHeight,NULL);
pPic->Release();
if(SUCCEEDED(bResult))
{
return S_OK;
}
else
{
return E_FAIL;
}
}
總結知識點:
1.MFC顯示圖片 (Qt是創建了一個QPixmap對象進行的畫QPixmap,來進行實現的)
//****************顯示BMP格式圖片****************//
void CDrawMapTest8_23View::ShowBitmap(CDC *pDC, CString BmpName,CRect rect)
{
CImage img;
HRESULT ret=img.Load(BmpName);
HBITMAP m_hBitmap=img.Detach();
if( m_bitmap.m_hObject )
{
m_bitmap.Detach(); //切斷CWnd和窗口聯繫
}
m_bitmap.Attach(m_hBitmap); //將句柄HBITMAP m_hBitmap與CBitmap m_bitmap關聯
/*
//邊界
CRect rect;
GetClientRect(&rect);
//圖片顯示(x,y)起始座標
int m_showX=0;
int m_showY=0;
int m_nWindowWidth = rect.right - rect.left; //計算客戶區寬度
int m_nWindowHeight = rect.bottom - rect.top; //計算客戶區高度
*/
//定義並創建一個內存設備環境DC
CDC dcBmp;
if( !dcBmp.CreateCompatibleDC(pDC) ) //創建兼容性的DC
return;
BITMAP m_bmp; //臨時bmp圖片變量
m_bitmap.GetBitmap(&m_bmp); //將圖片載入位圖中
CBitmap *pbmpOld = NULL;
dcBmp.SelectObject(&m_bitmap); //將位圖選入臨時內存設備環境
//圖片顯示調用函數stretchBlt
pDC->StretchBlt(0,0,m_bmp.bmWidth,m_bmp.bmHeight,&dcBmp,0,0,m_bmp.bmWidth,m_bmp.bmHeight,SRCCOPY);
dcBmp.SelectObject(pbmpOld); //恢復臨時DC的位圖
DeleteObject(&m_bitmap); //刪除內存中的位圖
dcBmp.DeleteDC(); //刪除CreateCompatibleDC得到的圖片DC
}