MFC 关于MFC中CImage的简单使用
首先要将#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)像素修改为红色
MFC 关于MFC中CImage的简单使用的更多相关文章
- MFC关于多线程中传递窗口类指针时ASSERT_VALID出错的另类解决 转
MFC关于多线程中传递窗口类指针时ASSERT_VALID出错的另类解决 在多线程设计中,许多人为了省事,会将对话框类或其它类的指针传给工作线程,而在工作线程中调用该类的成员函数或成员变量等等. ...
- 实现MFC扩展DLL中导出类和对话框
如果要编写模块化的软件,就要对对动态链接库(DLL)有一定的了解,本人这段时间在修改以前的软件时,决定把重复用的类和对话框做到DLL中,下面就从一个简单的例子讲起,如何实现MFC扩展DLL中导出类和对 ...
- mfc视类中错误:IntelliSense: declaration is incompatible with。。。解决方案
基本情况是我自己写了一个类: class CDib {....} 然后在mfc自动生成的“工程名Dlg.cpp”中使用类CDib,我的工程名是MfcPictureProcessing,所以类是clas ...
- 关于MFC框架程序中CWinApp::OnIdle
很早之前就发现,我写的图形引擎在MFC框架程序中的刷帧率始终在60FPS左右.好在自己的程序对刷帧率的要求不是很高,所以一直没有太过纠结此事.直到今天看了别人的程序才发现应该在函数CWinApp::O ...
- [转]MFC子线程中更新控件内容的两种办法
一.概述 每个系统中都有线程(至少都有一个主线程),而线程最重要的作用就是并行处理,提高软件的并发率.针对界面来说,还能提高界面的响应能力.一般的,为了应用的稳定性,在数据处理等耗时操作会单独在一个线 ...
- 【MFC】MFC改变对话框中静态文本的字体大小
MFC改变对话框中静态文本的字体大小 2010/08/09 11:30 VC的对话框字体设置对所有控件都有效,你不能单独地改变某个静态文本的字体.对于你的问题,需要首先用CreateFont来建立一个 ...
- C++ 关于MFC多线程编程中的一些注意事项 及自定义消息的处理
在多线程编程中,最简单的方法,无非就是利用 AfxBeginThread 来创建一个工作线程,看一下这个函数的说明: CWinThread* AFXAPI AfxBeginThread( AFX_T ...
- 【MFC】mfc控件位置调整和坐标确定 .
摘自DoubleLi: http://www.cnblogs.com/lidabo/archive/2012/08/24/2654678.html mfc控件位置调整和坐标确定 http://my ...
- asp.net mvc 中 一种简单的 URL 重写
asp.net mvc 中 一种简单的 URL 重写 Intro 在项目中想增加一个公告的功能,但是又不想直接用默认带的那种路由,感觉好low逼,想弄成那种伪静态化的路由 (别问我为什么不直接静态化, ...
随机推荐
- MyBatis与Spring整合
1.单独使用MyBatis 单独使用MyBatis,不结合其他框架,主要步骤是: 1.创建SqlSessionFactory对象 创建方法是通过SqlSessionFactoryBuilder这个类从 ...
- Programming in Lua读书笔记
Lua的长处之一就是可以通过新类型和函数来扩展其功能.动态类型检查最大限度允许多态出现,并自动简化调用内存管理的接口,因为这样不需要关心谁来分配内存谁来释放内存,也不必担心数据溢出.高级函数 ...
- Linux学习笔记之——基础命令学习
1.find 按照名字查找:find / -name file_name 2.zip压缩 1) 我想把一个文件repartition.txt和一个目录invader压缩成为amateur.zip: ...
- shape 代码生成器
场景: 可以尝试使用shape的xml文件来代替图片. 可以起到减小包大小的效果. Android Button Maker是一个可以在线生成按钮代码的工具.Android API提供了XML文件定义 ...
- Android使用Drawable资源之使用ClipDrawable资源 实现进入条
以前我自定义的进度条(就是咱们现在工程中用的)是从android的源码中扒出来的一个XML,然后把里面的图片给替换了.一直不知道它的具体原理是什么. 今天得空研究了一下,发现它的原理其实就是用的and ...
- 六十三、android pad
参照连接:http://blog.csdn.net/guolin_blog/article/details/8881711 http://www.xue5.com/Mobile/Android/708 ...
- 杭电acm 1003
#include<cstdio> #include<cstdlib> #include<cstring> #include<iostream> usin ...
- 开发android App干坏事(二)-wifi控制
本来今天打算换个话题的,鉴于昨天android篇反响还不错,最近也是在做这方面的东西,今天聊聊一个新的android的发现-wifi的控制(好吧,其实也不能说是坏事,只是觉得wifi安全还是要引起警示 ...
- Jmeter分布式测试
随着并发量的增大,一台机器就不能满足需求了,所以我们采用分布式(Master-Slaver)的方案去执行高并发的测试 注意事项: Master机器一般我们不执测试,所以可以拿一台配置差些的机器,主要用 ...
- .vimrc vim 配置大全
map <F9> :call SaveInputData()<CR>func! SaveInputData() exec "tabnew" exec 'no ...