MFC 关于MFC中CImage的简单使用
2016-03-16 23:35
274 查看
首先要将#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)像素修改为红色
一、图片的载入
如果需要在界面上显示的是已经存在的图片,那么需要将待显示的图片载入至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)像素修改为红色
相关文章推荐
- 灵魂和身体
- html frame标签(点击左边框架内容而在右边框架做出反应)
- oracle 新建用户及授予权限
- Android LayoutInflater深度解析
- 第三次作业 词频统计
- 2.1php标签,语法,注释
- linux命令 awk学习
- python重新加载模块的方法有哪些
- 使用select异步IO实现socketserver服务器 源码剖析
- 不靠谱的tooltip
- 知识点3:编译开源代码
- Canvas利用圆绘制正余弦函数叠加图像
- 10个最“牛叉”的代码注释
- linux如何写一个daemon程序
- python实现http请求的方法有哪些
- ConcurrentHashMap总结
- 表联接
- android面试问题
- Android各种简单的对话框的实现案例
- 进程间通信之-管道--linux内核剖析(八)