C語言寫控制檯程式是無法加圖片的,只能用命令列輸出,最多就是設定下背景和字型,顏色之類的。如果開發API視窗程式,完全依賴於作業系統的函式庫。C語言本身並不提供這類函式。
下面是windows系統下實現的函式程式碼,第一個引數是圖片的存放的位置,第二個引數是視窗控制代碼。
HRESULT ShowPic(char *lpstrFile,HWND hWnd)
{
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
//分配全域性儲存空間
HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, dwFileSize);
LPVOID pvData = NULL;
if (hGlobal == NULL)
if ((pvData = GlobalLock(hGlobal)) == NULL)//鎖定分配記憶體塊
ReadFile(hFile,pvData,dwFileSize,&dwByteRead,NULL);//把檔案讀入記憶體緩衝區
GlobalUnlock(hGlobal);
CreateStreamOnHGlobal(hGlobal, TRUE, &pStm);
//裝入圖形檔案
bResult=OleLoadPicture(pStm,dwFileSize,TRUE,IID_IPicture,(LPVOID*)&pPic);
if(FAILED(bResult))
OLE_XSIZE_HIMETRIC hmWidth; //圖片的真實寬度, 單位為英寸
OLE_YSIZE_HIMETRIC hmHeight; //圖片的真實高度, 單位為英寸
pPic->get_Width(&hmWidth);
pPic->get_Height(&hmHeight);
//轉換hmWidth和hmHeight為pixels距離,1英寸=25.4毫米
int nWidth = MulDiv(hmWidth,GetDeviceCaps(hDC_Temp,LOGPIXELSX),2540);
int nHeight = MulDiv(hmHeight,GetDeviceCaps(hDC_Temp,LOGPIXELSY),2540);
//將圖形輸出到螢幕上(有點像BitBlt)
bResult=pPic->Render(hDC_Temp,0,0,nWidth,nHeight,0,hmHeight,hmWidth,-hmHeight,NULL);
hmHeight,NULL);
pPic->Release();
CloseHandle(hFile);//關閉開啟的檔案
if (SUCCEEDED(bResult))
return S_OK;
C語言寫控制檯程式是無法加圖片的,只能用命令列輸出,最多就是設定下背景和字型,顏色之類的。如果開發API視窗程式,完全依賴於作業系統的函式庫。C語言本身並不提供這類函式。
下面是windows系統下實現的函式程式碼,第一個引數是圖片的存放的位置,第二個引數是視窗控制代碼。
HRESULT ShowPic(char *lpstrFile,HWND hWnd)
{
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);
//轉換hmWidth和hmHeight為pixels距離,1英寸=25.4毫米
int nWidth = MulDiv(hmWidth,GetDeviceCaps(hDC_Temp,LOGPIXELSX),2540);
int nHeight = MulDiv(hmHeight,GetDeviceCaps(hDC_Temp,LOGPIXELSY),2540);
//將圖形輸出到螢幕上(有點像BitBlt)
bResult=pPic->Render(hDC_Temp,0,0,nWidth,nHeight,0,hmHeight,hmWidth,-hmHeight,NULL);
hmHeight,NULL);
pPic->Release();
CloseHandle(hFile);//關閉開啟的檔案
if (SUCCEEDED(bResult))
{
return S_OK;
}
else
{
return E_FAIL;
}
}