MFC 的Picture Control加载BMP和PNG的方法

原创 2012年08月02日 15:33:50

MFC的Picture Control要支持加载图片,首先要将其Type属性设置为Bitmap,其余的Icon和Enhanced Metafile本人未尝试过。也可以在代码中调用pStatic->ModifyStyle(0, SS_BITMAP);来修改。

 

1. 如果是简单的静态加载,可以先加图片加入资源,然后在"Image"中选定图片对应的资源ID即可。

2. 加载 BMP,一般的方法是调用SetBitmap:

CStatic* pWnd = (CStatic*)GetDlgItem(IDC_PIC); // 得到 Picture Control 句柄

 pWnd->SetBitmap((HBITMAP)::LoadImage(NULL, _T("bmp.bmp"),

                IMAGE_BITMAP,

                100,

                50,

                LR_CREATEDIBSECTION | LR_DEFAULTSIZE | LR_LOADFROMFILE));

3. 加载 PNG,需要借助CImage类

CImage image;

image.Load(_T("fp_scan.png"));

HBITMAP hBmp = image.Detach();

m_StaticImage.SetBitmap(ahBmp[iIndex]);

m_StaticImage.SetWindowPos(NULL,

        0, 0, 48, 48,

        SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOZORDER);

 

注意(这些都是自己在网上搜索总结的):

1. 如果将提取出来的HBITMAP用于其它地方,譬如将HBITMAP关联到了图片控件,那么必须清楚,CBitmap 在析构函数被调用时,这个 HBITMAP 会被销毁,因此图片控件中的HBITMAP也会不存在,因为它们指向的是同一个资源。

2. 如果不想让CBitmap 析构函数销毁 HBITMAP,可以先调用 CBitmap 类的基类的一个函数:HGDIOBJ Detach( );通过该函数,HBITMAP 将会从 CBitmap 中分离出来,这样 CBitmap 就不会销毁 HBITMAP 了,分离的时候注意它返回的是一个 HGDIOBJ ,需要将该句柄强制转换成 HBITMAP。还有要明白,一旦分离了, HBITMAP 的销毁工作就要由我们自己来负责了,否则又造成了资源泄露!

3. 当通过图片控件的 SetBitmap将HBITMAP 关联到图片控件后,我们就不需要销毁 HBITMAP 了。因为,图片控件在销毁时(DestroyWindow),它会自行销毁 HBITMAP 的。

4. 调用 SetBitmap 函数,图片控件自己会重绘的。

5. 在调用 SetBitmap 后,SetBitmap 会返回前一张图片的 HBITMAP,返回的目的,当然是便于我们自己来销毁前一张图片的 HBITMAP 。这一点也需要注意的,否则还是存在资源不断泄露的问题。销毁 HBITMAP ,使用 DeleteObject(phBitmap) 。

HBITMAP hBmp =(HBITMAP) LoadImage(NULL,_T("c:\\b.bmp"),IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
m_picture.SetBitmap(hBmp);
hBmp = m_picture.GetBitmap();
if (hBmp != NULL)
{
    DeleteObject(hBmp);
}

 

 

 

相关文章推荐

VC++图片控件(Picture Control)显示资源位图(BMP)、文件位图(BMP)、其它格式文件图片(JPG\PNG\BMP)的方法

在VC++ MFC编程中,我们常使用Picture Control图片控件来显示图像。下面简单归纳几种显示不同的方式: 第一种、资源位图方式显示BMP图片 如果要显示的是一张BMP位图,则可以采用这种...

MFC中利用picture control控件设置闪烁按钮。(控件以加载bitmap位图为例)

1. 从网上下载自己所需按钮图片,并转换为bmp格式(若选用图标,则转换为ico格式),将图片放在项目的res文件夹下。再将两个图标导入到资源视图中(资源视图下的Bitmap上点击(若bitmap,则...
  • wf6892
  • wf6892
  • 2016年09月04日 17:58
  • 904

MFC 对话框Picture Control(图片控件)中静态和动态显示Bmp图片

最近有同学问我如何实现MFC基于对话框在图片控件中加载图片?其实使用MFC显示图片的方法各种各样,但是还是有些同学不知道怎样显示.以前在《数字图像处理》课程中完成的软件都是基于单文档的程序,这里介绍两...

MFC在picture control中JPG/BMP/ICO等格式图片显示,并支持清除图片显示

1、添加一个picture control工具,修改ID为ID_STATIC_PICTURE 2、增加一个按钮,caption为查看图片,双击按钮生成按钮的点击事件,在事件中添加代码,其中_T("P...

MFC加载带有透明通道的png图片(两种方法)

【原文】http://blog.csdn.net/zhongbin104/article/details/8730935

高级应用加载TGA BMP PNG JEPG ——包含JPEG解码

texture.cpp #include #include"texture.h" ///////////JPGE读写操作库头文件 #include "include/jpeglib.h"...
  • labrary
  • labrary
  • 2013年03月12日 13:29
  • 585

数字图像处理 CImage类的使用与封装(jpg png gif tif bmp等格式图像的加载、数据读写、保存等功能)

介绍CImage类的使用,处理JPGE、GIF、BMP、PNG等多种格式图片,扩展了图片处理功能且能与CBitmap 进行转换( 因为所载入的位图句柄都是HBITMAP,所以可相互转换)...

Windows下OpenGL轻松加载BMP, GIF, JPEG, PNG, and TIFF图片

Windows下轻松加载BMP, GIF, JPEG, PNG, and TIFF图片,并用OpenGL生成纹理 /* window下OpenGL加载纹理,图片格式BMP, GIF, JPEG,...

picture control中显示jpg,jif,bmp格式图象

char *lpImageFile; //图像文件名 HWND hWnd ; //要显视对象句柄 int nScrWidth ; //显示宽度 int nScrHeight ; //显示高度 ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:MFC 的Picture Control加载BMP和PNG的方法
举报原因:
原因补充:

(最多只允许输入30个字)