首先要将#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)像素修改为红色