MFC提供的CWnd只有默认加载BMP文件的接口,对JPG等图像是不支持的,而实际中经常需要用到非BMP的图片,在VC中加载.JPG格式的图片,有两种方法,用流对象加载和用IPicture接口加载。

IPicture  * m_picture;
OLE_XSIZE_HIMETRIC m_width;
OLE_YSIZE_HIMETRIC m_height;

CString m_filename( " D:\\009.jpg " ); // 文件名

CFile m_file(m_filename,CFile::modeRead );

// 获取文件长度
DWORD m_filelen  =  m_file.GetLength(); 

// 在堆上分配空间
HGLOBAL m_hglobal  =  GlobalAlloc(GMEM_MOVEABLE,m_filelen);

LPVOID pvdata  =   NULL ;
// 锁定堆空间,获取指向堆空间的指针
pvdata  =  GlobalLock(m_hglobal);

// 将文件数据读区到堆中
m_file.ReadHuge(pvdata,m_filelen);

IStream *   m_stream;

GlobalUnlock(m_hglobal);

// 在堆中创建流对象
CreateStreamOnHGlobal(m_hglobal, TRUE , & m_stream);

// 利用流加载图像
OleLoadPicture(m_stream,m_filelen, TRUE ,IID_IPicture,(LPVOID * ) & m_picture);

m_picture -> get_Width( & m_width);
m_picture -> get_Height( & m_height);    

CDC *  dc  =  GetDC();

m_IsShow  =   TRUE ;
CRect rect;
GetClientRect(rect);
SetScrollRange(SB_VERT, 0 ,( int )(m_height / 26.45 ) - rect.Height());
SetScrollRange(SB_HORZ, 0 ,( int )(m_width / 26.45 ) - rect.Width());

m_picture -> Render( * dc, 1 , 50 ,( int )(m_width / 26.45 ),( int )(m_height / 26.45 ), 0 ,m_height,m_width, - m_height, NULL );

以上代码是用创建流文件的方式加载,也可以加载.gif图片,但不能显示动画效果。
下面的代码则是用IPicture接口的方式来加载jpg图片(全屏显示图片)。
注意:这两段代码不能用在wince平台上,在wince上加载有另外的函数。

    CString szFileName;
    szFileName.Empty();
    szFileName  =   " D:\\84.jpg " ;
    
    IStream  * pStm;
    CFileStatus fstatus;
    CFile file;
     LONG  cb;
    
     if  (file.Open(szFileName,CFile::modeRead)  &&  file.GetStatus(szFileName,fstatus)  &&  ((cb  =  fstatus.m_size) ! =   - 1 ))
    {
        HGLOBAL hGlobal  =  GlobalAlloc(GMEM_MOVEABLE,cb);
        LPVOID pvData  = NULL ;
         if  (hGlobal ! =   NULL )
        {
            pvData  =  GlobalLock(hGlobal);
             if  (pvData ! =   NULL )
            {
                file.ReadHuge(pvData,cb);
                GlobalUnlock(hGlobal);
                CreateStreamOnHGlobal(hGlobal, TRUE , & pStm);
            }
        }   
    }
    
    
     //  HRESULT Render( HDC hdc,  // 渲染图像用的设备环境句柄
     //   long  x,  // 在hdc上的水平坐标
     //   long  y,  // 在hdc上的垂直坐标
     //   long  cx,  // 图像宽度
     //   long  cy,  // 图像高度
     //  OLE_XPOS_HIMETRIC xSrc,  // 在源图像上的水平偏移
     //  OLE_YPOS_HIMETRIC ySrc,  // 在源图像上的垂直偏移
     //  OLE_XSIZE_HIMETRIC cxSrc, // 在源图像上水平拷贝的数量
     //  OLE_YSIZE_HIMETRIC cySrc, // 在源图像上垂直拷贝的数量
     //  LPCRECT prcWBounds  // 指向目标图元设备环境句柄的指针);
    CComQIPtr < IPicture >  m_picture;
    HRESULT hr  =  OleLoadPicture(pStm, 0 , false ,IID_IPicture,(void ** ) & m_picture);
     long  a,b;
    m_picture -> get_Width( & a);
    m_picture -> get_Height( & b);
    CSize sz(a,b);
    CDC  * pdc  =  GetDlgItem(IDC_STATIC) -> GetDC();
     //     CDC  * pdc  =  GetDC();
     //     pdc -> HIMETRICtoDP( & sz);
    CRect rect;
    GetClientRect(rect);
     //     GetDlgItem(IDC_STATIC) -> GetClientRect( & rect);
    m_picture -> Render( * pdc, 0 , 0 ,sz.cx,sz.cy, 0 ,b,a, - b, & rect);
    m_picture -> Render( * pdc,rect.left,rect.top,rect.Width(),
                        rect.Height(), 0 ,b,a, - b, & rect);

也可以用GDI+把图片转成.bmp文件再加载,在StdAfx.h中静态调用gdiplus.lib,即由编译系统完成对DLL的加载,应用程序结束时卸载DLL的编码。如下:
#ifndef   ULONG_PTR
#define   ULONG_PTR   unsigned   long*
#include   "GdiPlus.h"
using   namespace   Gdiplus;
#pragma   comment(lib,   "gdiplus.lib")
#endif

2、在类的头文件中定义,以下成员变量,用来初始化GDI+的使用和结束使用。
GdiplusStartupInput   m_gdiplusStartupInput;  
ULONG_PTR   m_gdiplusToken;

3、在初始化函数中,初始化GDI+。如:在OnCreate()函数中加入初始化GDI+的函数:
GdiplusStartup(&m_gdiplusToken,   &m_gdiplusStartupInput,   NULL);

4、对应的在OnDestroy()函数中加入结束GDI+使用的函数:  
GdiplusShutdown(m_gdiplusToken);

接着,就可以使用GDI+了,要实现要求的内容很容易,方法如下:
写一个如下的方法:
HBITMAP   ReturnHBITMAP(CString   FileName)//FileName可能是bmp、dib、png、gif、jpeg/jpg、tiff、emf等文件的文件名
{
          Bitmap   tempBmp(FileName.AllocSysString())   ;
        Color       backColor;      
        HBITMAP       HBitmap;  
        tempBmp.GetHBITMAP(backColor,&HBitmap);
        return   HBitmap;

}

在WM5.0+VC8.0的环境下,还可以COM(组件)的方式加载图片,这种方法能加载的图片的格式比较全(.jpg,.png,.gif),在Windows CE Tools\wce500\Windows Mobile 5.0 Pocket PC SDK\Samples\CPP\Win32\Imaging例子中,用这个COM可以加载皮肤,有兴趣的朋友可以试一下。

MFC 加载jpg等图片相关推荐

  1. MFC 加载并显示图片

    方法一  用API OleLoadPicture来加载JPG.GIF格式的图片(注:不支持PNG格式,另外GIF只能加载第一帧,且不支持透明)OleLoadPicture 函数实际上创建了一个IPic ...

  2. MFC 加载gif动态图片的方法

    在一个项目中需要加入GIF动画.一个版本时通过IE浏览器显示网页的形式,js脚本.CSS他人编写较繁琐:另一个VC项目需要使用MFC直接加载GIF动画.加载GIF动画网上有多种方式,大多数是将GIF填 ...

  3. MFC加载gif动态图片的方法

    在一个项目中需要加入GIF动画.一个版本时通过IE浏览器显示网页的形式,js脚本.CSS他人编写较繁琐:另一个VC项目需要使用MFC直接加载GIF动画.加载GIF动画网上有多种方式,大多数是将GIF填 ...

  4. MFC 加载并显示图片的四种方法

    https://blog.csdn.net/u013919153/article/details/99407029

  5. MFC加载PNG图片

    在网上看到很多加载bmp格式的图片,但对加载png格式的图片却介绍的很少.下面我来写一种加载png格式图片的方法. 在对话框拖入一个Picture Control 先修改控件的ID,然后再给控件添加变 ...

  6. VC下加载多种格式图片的方法总结

    From: http://www.cnblogs.com/Daywei/archive/2011/03/19/1988848.html 尽管VC有提供相应的API和类来操作bmp位图.图标和(增强)元 ...

  7. MFC加载图标,位图。LoadImage LoadIcon, LoadBitmap

    MFC加载图标和位图,有2种方式,一种是从工程的资源中加载,一种是从文件加载. 先说图标的,图标格式为.ico,也就是我们常说的ICON图片. 我们直观的希望是加载ico使用LoadIcon()函数, ...

  8. swift 加载gif 框架图片

    swift 加载gif 框架图片 SwiftGifOrigin 以下代码 轻松搞定 let imgView = UIImageView(frame: CGRect(x: 50, y: 100, wid ...

  9. 小程序一次性上传多个本地图片,上拉加载照片以及图片加载延迟解决之道

    一:小程序之一次性上传多个本地相片 最近由于项目需要所以学了下小程序,也做了一些东西,随后便有了以下的一些总结了,现在说说如何使用小程序一次性上传多个本地相片. 问题描述 最近做项目的时候要实现一个上 ...

最新文章

  1. 今天意外和身份证结缘
  2. 轻松搞定项目中的空指针异常Caused by: java.lang.NullPointerException: null
  3. 数据中心可以不设置柴发吗?
  4. Dorado 7.1.20 发布,Ajax的Web开发平台
  5. android 如何终止线程
  6. 聊聊高并发(三十一)解析java.util.concurrent各个组件(十三) 理解Exchanger交换器
  7. [机器学习] Boosting算法1 --- AdaBoost
  8. webpack配置路径问题
  9. oracle9i 查询scn,在oracle10g 10.2.0.1上测试不完全恢复_recover database until scn
  10. 中职c语言课程教学标准,C语言课程标准.doc
  11. Ubuntu LogViewer调试工具
  12. 【翠花学Vue】每日打卡——vue打卡6
  13. Graphpad,经典绘图工具初学初探
  14. 手把手教你用Python轻松玩转SQL注入
  15. 1.1 机器学习与Python
  16. uni-app微信公众号(5)——新增、修改地址
  17. 【题解】洛谷P1914 小书童——密码 c++
  18. python读取输入数据的第二行_Python读取键盘输入的2种方法
  19. TMS320C6455入门实践(六)——编写boot程序
  20. 2019美研计算机录取,2019美研录取更新 | 哥伦比亚大学、芝加哥大学OFFER携手来袭...

热门文章

  1. 2021暑期学习第23天
  2. 【编译原理】:如何将控制语句翻译成四元式
  3. 数字电路基础(五)算术运算电路
  4. 论文成功写作技巧之行之有效的写作从“结果”开始(下)
  5. 设置 IIS下虚拟目录或应用程序不继承主站点的web.config
  6. 动态网站的搜索引擎优化策略(转)
  7. 8.custom-links
  8. iOS xcode9中framework静态库的创建以及xib和图片的使用记录
  9. 非科班AI小哥火了:他没有ML学位,却拿到DeepMind的offer
  10. 基于MSP430F5529的后驱四轮小车