MFC中显示 .bmp格式的位图

最近在看VisualC++ 图像处理的书籍,表示一直在从基础做起,今天就记录一个简单功能的实现,显示.bmp格式的位图。

首先需要理解的是窗口创建的过程包括两个步骤:首先擦除窗口的背景,然后在对窗口进行重新绘制。

一般而言,对于单文档或多文档的MFC程序,显示图像的代码要放在OnDraw函数之中。刚刚说过,窗口重绘时,要先将窗口的背景擦除,也就是发送WM_ERASEBKGND消息,然后用OnEraseBkgnd()函数处理这个消息,所以我们的显示图像的代码也可以放在这个函数之中。当然,这里只是为了实现显示位图这一个功能,在实际工程中,要根据实际情况,选择代码放置的地方。

下面先给出代码,然后一行一行地详细解释:

BOOL CLoadBitmapView::OnEraseBkgnd(CDC* pDC)
{
 // TODO: 在此添加消息处理程序代码和/或调用默认值
 //return FALSE;
 HBITMAP hBit;
 hBit=(HBITMAP) LoadImage(NULL,_T("D:\\Axing.bmp"),IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION); //载入图像

CBitmap cBit;

cBit.Attach(hBit);

CDC MemDC;

MemDC.CreateCompatibleDC(pDC); //创建与当前设备描述表相适应的内存DC

BITMAP bitmap;

cBit.GetBitmap(&bitmap);

CBitmap *oldBit;

oldBit=MemDC.SelectObject(&cBit);

CRect rect;
 GetClientRect(&rect);

pDC->BitBlt(100,100,rect.Width()/2.5,rect.Height(),&MemDC,0,0,SRCCOPY);
 return TRUE;

//return CView::OnEraseBkgnd(pDC);
}

首先来解释一下HBITMAP、CBitmap、BITMAP三者之间的关系。

HBITMAP是图片的句柄,CBitmap是MFC定义的一个类,在这个类中对HBITMAP进行了封装,BITMAP则是一个结构体,这个结构体中保存着位图的各种信息(如宽度和高度等)。有三个函数是和这三个类型息息相关的。

第一个:Attach(),这个函数是CBitmap类的成员函数,作用就是将HBITMAP类型转换成CBitmap类型。我们在代码中会用到它。

第二个:GetBitmap(),这个函数也是CBitmap类的成员函数,作用就是获取位图的信息,并将位图的信息保存在BITMAP 结构指针中。

第三个:GetObject(),这个函数的作用就是,从HBITMAP句柄中获取BITMAP结构。

这三个函数的具体用法,详细说明在这里就不赘述了,用的时候可以百度一下很方便的。

我们先建立了一个HBITMAP类型的句柄,然后用LoadImage()函数来载入一个位图,并保存位图的句柄。之后,创建一个CBitmap类的对象,然后将HBITMAP转换成CBitmap对象(用Attach()函数)。之后用CReateCompatibleDC()函数,创建一个与当前设备上下文相兼容的内存DC。

问题来了,为什么要创建这个内存DC呢?

其实,这个内存DC的作用就是缓冲。如果需要对屏幕进行比较多的GUI操作,如果直接对屏幕DC进行操作,会导致同显示内存之间的过于频繁的数据交换,于是程序运行效率将受到严重影响。任何绘图的过程都是这样,要完成一幅图像的显示,总是在显示终端上依次绘制每个像素点,以形成完整的图像。我们在内存中虚拟一块画布(就是内存DC),绘图时仅仅对内存进行操作。待政府图像绘制完成时在整体复制到屏幕上,这样避免了外设和内存之间频繁的数据交换,程序的运行效率会提高很多。这就是使用CreateCompatibleDC()函数创建内存DC 的作用。

接着,我们将位图选入到内存DC中(MemDC.SelectObject(&cBit)),这一步也是相当重要的。因为当兼容的内存DC创建的时候,他的显示表面是标准的一个单色像素宽和单色像素高。在应用程可以使用内存DC进行绘图操作之前,必须将一个具有正确高度和宽度的位图,选入到内存DC中,这时内存设备上下文显示表面的大小就由当前选入的位图决定了。

之后CRect rect;GetClientRect(&rect);用于获取客户区。

最后用BitBlt()函数将内存DC中的内容复制到当前DC中,显示位图完毕。

这里要解释一下BitBlt函数,它的函数原型为:

BOOLBitBlt(int x,int y,int nWidth,int nHeight,CDC*pSrcDC,int xSrc,int ySrc,DWORDdwRop);

参数x、y表示目的DC(当前设备上下文)矩形区域的左上角坐标,nWidth,nHeight,表示矩形区域的宽和高,pSRCDC则是源DC(内存DC)的指针,xSrc和ySrc表示源DC矩形区域的左上角坐标。我们可以看到并没有参数表示源目的矩形区域的宽和高,这样,区域之间的复制只能是1:1的,所以当图像比较大时,只能显示图像的一部分。为了解决这个问题,可以用StretchBlt()函数,这个函数和BitBlt()函数的功能基本一致,只是可以对图像进行伸缩变换,这是因为在StretchBlt()函数中增加了两个参数,表示源DC矩形区域的大小。所以上面的代码可以改成

pDC->StretchBlt(100,100,rect.Width()/2.5,rect.Height(),&MemDC,0,0,bitmap.bmWidth,bitmap.bmHeight,SRCCOPY);

这样就可以显示整张位图了。

时间: 2024-12-25 16:59:51

MFC中显示 .bmp格式的位图的相关文章

MFC对话框显示BMP图片

1.MFC对话框显示BMP图片我们先从简单的开始吧.先分一个类: (一) 非动态显示图片(即图片先通过资源管理器载入,有一个固定ID) (二) 动态载入图片(即只需要在程序中指定图片的路径即可载入) 为方便说明,我们已经建好一个基于对话框的工程,名为Ttest. 对话框类为CTestDlg (一)    非动态载入图片. 方法1.先从最简单的开始,用picture 控件来实现. 步骤: 先在资源里Import一张图片,ID为IDB_BITMAP2 然后在对话框上添加一个picture控件,右键点

SD卡在电脑中显示RAW格式该怎么修复?

为什么SD卡在电脑显示RAW格式,无法打开,那该如何提取里面的数据?还能找回来吗?请继续阅读本篇文章. 当SD卡电脑读取后,发现SD卡RAW故障现象出现,这样的情况有可能是SD卡内部扇区或者芯片损坏导致的,显示该卡需要格式化,否则无法使用?SD卡接入电脑后无法识别的话,点击桌面上的"我的电脑"或是"计算机"右键,弹出的菜单选择"管理"跳出新窗口后,点击左下的"磁盘管理"然后看右下位置有没有找到一个可移动介质,如果没有说明完全识

GUI图形屏在emWin应用中显示BMP位图片

1.1需要安装的软件 (1) MDK-ARM V5.10: 安装完MDK-ARM V5.10 以后还要安装STM32F2xx 的PACK(MDK V5.10 只能安装Keil.STM32F2xx_DFP.2.1.0.pack 或更低版本),如果不想安装PACK,安装MDK Cortex-M Legacy Device Support V5.10(mdkcm510.exe)也是可以的:另外MDK-ARM V5.10以后的版本是无法支持中文UTF-8编码的. (2) J-LINK相关驱动程序. 1.

[00011]-[2015-08-26]-[00]-[Windows 程序设计 ---MFC 截屏--->BMP格式 --->JPG格式]

HBITMAP CopyScreenToBitmap(LPRECT lpRect){ HDC hScrDC, hMemDC; // 屏幕和内存设备描述表 HBITMAP hBitmap, hOldBitmap; // 位图句柄 int nX, nY, nX2, nY2; // 选定区域坐标 int nWidth, nHeight; // 位图宽度和高度 int xScrn, yScrn; // 屏幕分辨率 if (IsRectEmpty(lpRect)) return NULL; hScrDC

MFC CListCtrl 显示bmp图片

m_ListCtrl.SetExtendedStyle(m_ListCtrl.GetExtendedStyle()| LVS_EX_SUBITEMIMAGES | LVS_EX_GRIDLINES); m_ListCtrl.InsertColumn(0, L"#", LVCFMT_CENTER, 0); m_ListCtrl.InsertColumn(1,_T("T1"),LVCFMT_LEFT,100); m_ListCtrl.InsertColumn(2,_T(

MFC中BMP图片双显和灰度

<一>. Bmp图片双显和灰度原理 为了方便后续的量化采样处理,这里首先要实现bmp图片双显的功能,即在menu的左边显示原图,把原图的文件头数据和信息头数据保存在全局变量数组中:同时建立一个临时的”picture.bmp”图片(默认保存路径在打开原图的位置),以后的操作对临时的图片进行处理. 1 什么叫灰度图?任何颜色都有红.绿.蓝三原色组成,假如原来某点的颜色为RGB(R,G,B),那么,我们可以通过下面几种方法,将其转换为灰度: 浮点算法:Gray=R*0.3+G*0.59+B*0.11

BMP格式详解

BMP格式详解 BMP文件格式详解(BMP file format) BMP文件格式,又称为Bitmap(位图)或是DIB(Device-Independent Device,设备无关位图),是Windows系统中广泛使用的图像文件格式.由于它可以不作任何变换地保存图像像素域的数据,因此成为我们取得RAW数据的重要来源.Windows的图形用户界面(graphical user interfaces)也在它的内建图像子系统GDI中对BMP格式提供了支持. 下面以Notepad++为分析工具,结合

BMP格式,转载

BMP文件格式,又称为Bitmap(位图)或是DIB(Device-Independent Device,设备无关位图),是Windows系统中广泛使用的图像文件格式.由于它可以不作任何变换地保存图像像素域的数据,因此成为我们取得RAW数据的重要来源.Windows的图形用户界面(graphical user interfaces)也在它的内建图像子系统GDI中对BMP格式提供了支持. 下面以Notepad++为分析工具,结合Windows的位图数据结构对BMP文件格式进行一个深度的剖析. BM

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

在VC++ MFC编程中,我们常使用Picture Control图片控件来显示图像.下面简单归纳几种显示不同的方式: (实例可在我的CSDN资源中下载:http://download.csdn.net/detail/margin1988/8341525) 第一种.资源位图方式显示BMP图片 如果要显示的是一张BMP位图,则可以采用资源位图方式,具体步骤如下: (1)将BMP文件拷贝到工程的res目录下: (2)在对话框中添加一个Picture Control控件,例如:ID为IDC_STATI