首先要將#include <atlimage.h>加進來,開始時我加到stdafx.h中,但一直提示windows.h被重復引入的問題,後將其加在別的頭文件中,就可以了.. --!
一、圖片的載入
如果需要在界面上顯示的是已經存在的圖片,那麼需要將待顯示的圖片載入至CImage對象之中,CImage提供了四個載入函數:
HRESULT Load(LPCTSTR pszFileName) throw( );
HRESULT Load(IStream* pStream) throw();
void LoadFromResource(HINSTANCE hInstance, LPCTSTR pszResourceName) throw( );
void LoadFromResource(HINSTANCE hInstance, UINT nIDResource) throw( );
如果需要顯示的圖片在程序運行時需要更換則通常使用第一個函數Load(LPCTSTR pszFileName)載入圖片,參數pszFileName指定要載入的圖片文件;如果需要顯示的圖片是固定不變的,則通常使用第三個LoadFromResource(HINSTANCE hInstance, LPCTSTR pszResourceName)或第四個函數LoadFromResource(HINSTANCE hInstance, UINT nIDResource)載入圖片,這兩個函數是從資源中取得圖片信息,每一個參數是包含有待載入圖片的模塊實例句柄,第二個參數是資源的ID或名稱。
LPCTSTR類型可以理解為 const char*
但是我在使用時需要加上 (LPCTSTR)"XX.jpg"
以下代碼分別通過Load和LoadFromResource載入了圖片:
CImage m_image1; // 實際代碼中,被聲明成了類成員
CImage m_image2; // 實際代碼中,被聲明成了類成員
m_image1.Load("G:\\xxx.jpg");
m_image2.LoadFromResource(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDB_BITMAP1));
在實際中,第一種方法會出現無法載入圖片的情況,目前我還不太清楚原因,希望知道的網友指教
二、圖片的顯示
將圖片載入CImage對象的目的是將其在界面之中顯示出來,顯示圖像用到的核心函數是Draw,Draw提供了6個重載函數,通過參數名稱,很容易了解參數的含義,其原型如下:
BOOL Draw(HDC hDestDC,int xDest,int yDest,int nDestWidth,int nDestHeight,
int xSrc,int ySrc, int nSrcWidth,int nSrcHeight ) const throw( );
BOOL Draw(HDC hDestDC,const RECT& rectDest,const RECT& rectSrc) const throw( );
BOOL Draw(HDC hDestDC,int xDest,int yDest ) const throw( );
BOOL Draw(HDC hDestDC,const POINT& pointDest) const throw( );
BOOL Draw(HDC hDestDC,int xDest,int yDest,int nDestWidth,int nDestHeight) const throw( );
BOOL Draw(HDC hDestDC,const RECT& rectDest) const throw( );
如果要以控件的大小來顯示圖片,可以通過以下代碼實現:
if(m_image2.IsNull()) //判斷有無圖像
return;
// 取得客戶區尺寸
CRect zcRect;
GetDlgItem(IDC_STATIC_PIC2)->GetClientRect(&zcRect);
// 將圖像顯示在界面之上
m_image2.Draw(GetDlgItem(IDC_STATIC_PIC2)->GetDC()->m_hDC,
zcRect.left,
zcRect.top,
zcRect.Width(),
zcRect.Height());
當然,可以十分簡單的用
image->Draw(this->GetDC()->m_hDC,0,0);即可
可以通過image->SetPixel(10,10,RGB(255,0,0));對圖片上的(10,10)像素修改為紅色