最终--VC中MFC如何显示位图(拉伸以及非拉伸)

简单的记一下如何显示位图:

1、声明一个CBitmap对象,并从资源中加位图。

2、创建一个兼容的DC,用CDC的成员函数CreateCompatibleDC

3、用CDC的成员函数SelectObject将位图选入到兼容DC中。

4、用CDC的成员函数BitBlt来输出位图。

就这样了,一个完整的位图说显示了!

========================== 显示位图=====================================

void CBitmapView::wtj_paint()
{
  CDC *pDC;                            //1
 指定设备环境,并获得指针
  pDC=GetDC();
 ------------------------------------------------------------------------------------
CBitmap wtj_bitmap;                    //2
 创建位图对象
  BITMAP bmInfo;                       // 3
定义位图变量  wtj_bitmap.LoadBitmap(IDB_BITMAP1);  //4加载位图到对象
------------------------------------------------------------------------------------------

 CDC dcMemory;                        //5
定义并创建内存环境
 dcMemory.CreateCompatibleDC(pDC);//
----------------------------------------------------------------------------//
关联位图对象和位图变量
 wtj_bitmap.GetObject(sizeof(bmInfo),&bmInfo);//6
将位图对象的图片放入到位图变量中
dcMemory.SelectObject(&wtj_bitmap);//7将位图变量选入到内存环境

---------------------------------------------------------------------------------------------
 pDC->BitBlt(100,100, bmInfo.bmWidth,bmInfo.bmHeight,  &dcMemory,0,0,SRCCOPY);
                                 //9
图片由内存环境传送至设备环境
ReleaseDC(pDC);                 //10 记得释放设备环境     
}

  

=======================显示位图,自如拉伸===================================

void CBitmapView::wtj_paint()
{
  CDC *pDC;
  pDC=GetDC();

-----------------------------

CRect rect;    //创建一个CRect对象rect,矩形结构类,此对象用来指定要拉伸变为的大小
---------------------------

  CBitmap wtj_bitmap;
  CDC dcMemory;
  wtj_bitmap.LoadBitmap(IDB_BITMAP1);
  BITMAP bmInfo;
  wtj_bitmap.GetObject(sizeof(bmInfo),&bmInfo);
  dcMemory.CreateCompatibleDC(pDC);
  dcMemory.SelectObject(&wtj_bitmap);
----------------------------------------

 pDC->StretchBlt(0,0,rect.Width(),rect.Height(),&dcMemory, 0,0, bmInfo.bmWidth,bmInfo.bmHei  ght, SRCCOPY);//利用StretchBlt()贴图实现自动拉伸
------------------------------------------- 

ReleaseDC(pDC);
}

//函数使用说明 ==其中指定矩形 表示要从源矩形大小变为指定矩形大小

目的设备环境 –>StretchBlt(目标矩左上x ,目标矩左上y , 指定矩形宽度 ,指定矩形高度, 源设备环境句柄, 源矩左上x, 源矩左上y, 源矩宽度,源矩高度 , SRCCOPY)

SRCCOPY:将源矩形区域直接拷贝到目标矩形区域。

StretchBlt

函数功能

函数从源矩形中复制一个位图到目标矩形,必要时按目前目标设备设置的模式进行图像的拉伸或压缩。

编辑本段函数原型

BOOL StretchBlt(HDC hdcDest, int nXOriginDest, int nYOriginDest, int nWidthDest, int nHeightDest, HDC hdcSrc, int nXOriginSrc, int nYOriginSrc, int nWidthSrc, int nHeightSrc, DWORD dwRop)

编辑本段参数

BOOL StretchBlt(HDC hdcDest, int nXOriginDest, int nYOriginDest, int nWidthDest, int nHeightDest, HDC hdcSrc, int nXOriginSrc, int nYOriginSrc, int nWidthSrc, int nHeightSrc, DWORD dwRop)

hdcDest:指向目标设备环境的句柄。

nXOriginDest:指定目标矩形左上角的X轴坐标,按逻辑单位表示坐标。

nYOriginDest:指定目标矩形左上角的Y轴坐标,按逻辑单位表示坐标。

nWidthDest:指定目标矩形的宽度,按逻辑单位表示宽度。

nHeightDest:指定目标矩形的高度,按逻辑单位表示高度。

hdcSrc:指向源设备环境的句柄。

nXOriginSrc:指向源矩形区域左上角的X轴坐标,按逻辑单位表示坐标。

nYOriginSrc:指向源矩形区域左上角的Y轴坐标,按逻辑单位表示坐标。

nWidthSrc:指定源矩形的宽度,按逻辑单位表示宽度。

nHeightSrc:指定源矩形的高度,按逻辑单位表示高度。

dwRop:指定要进行的光栅操作。光栅操作码定义了系统如何在输出操作中组合颜色,这些操作包括刷子、源位图和目标位图等对象。参考BitBlt可了解常用的光栅操作码列表。

 

 

 

 

 

 

CBitmap

目录

CBitmap

构造函数

初始化函数

属性

操作

编辑本段CBitmap

  继承图表[1]

CBitmap封装了Windows图形设备接口GDI)中的位图,并且提供了操纵位图的成员函数。使用CBitmap对象之前要先构造CBitmap对象,调用其中的一个初始化成员函数设置位图对象的句柄。此后就可以调用其它成员函数了。要了解有关使用像CBitmap这样的图形对象的详细信息,请参阅联机文档“Visual C++ 程序员指南中的图形对象

#include

CBitmap类的成员

编辑本段构造函数

CBitmap 构造一个CBitmap对象

编辑本段初始化函数

LoadBitmap 从应用的可执行文件中加载一个命名的位图资源来初始化位图对象。

LoadOEMBitmap 加载一个预定义的Windows位图来初始化位图对象。

LoadMappedBitmap 加载一个位图并把它的颜色映射为系统颜色。

CreateBitmap 用一个指定宽度、高度和位图模式的依赖于设备的内存位图初始化位图对象。CreateBitmapIndirect BITMAP结构中给出的宽度、高度和模式(可以不指定)的位图初始化位图对象。CreateCompatibleBitmap 用一个位图初始化对象使之与指定设备兼容。

CreateDiscardableBitmap 用一个可丢弃的、与指定设备兼容的位图初始化对象。

编辑本段属性

LoadBitmap 从应用的可执行文件中加载一个命名的位图资源来初始化位图对象LoadOEMBitmap 加载一个预定义的Windows位图来初始化位图对象LoadMappedBitmap 加载一个位图并把它的颜色映射为系统颜色。

编辑本段操作

FromHandle 给出Windows HBITMAP结构的指针时,返回指向CBitmap对象的指针。

SetBitmapBits 位图的位设为指定的值。

GetBitmapBits 拷贝指定位图的位值到指定的缓冲。

SetBitmapDimension 设置位图的宽度和高度(以0.1毫米为单位)。

GetBitmapDimension 返回位图的宽度和高度。要求已经调用SetBitmapDimension设置位图的宽度和高度。[2]

参考资料

Bitmap

目录

定义

位图图像

分辨率

索引颜色

算法

展开

定义

位图图像

分辨率

索引颜色

算法

展开

编辑本段定义

typedef struct tagBITMAP{

LONG bmType; //位图类型,必须为0

LONG bmWidth; //位图宽度

LONG bmHeight; //位图高度

LONG bmWidthBytes; //每一行像素所在的byte

WORD bmPlanes; //颜色平面数

WORD bmBitsPixel; //像素的位数

LPVOID bmBits; //位图内存指针

}BITMAP;

 

 

-----------------------------------------------------------------------------------------------------

加载一位图,可以使用LoadImage

HANDLE LoadImageHINSTANCE hinstLPCTSTR lpszNameUINT uTypeint cxDesiredint CyDesiredUINT fuLoad);

LoadImage可以用来加载位图,图标和光标

加载时可以规定加载图的映射到内存的大小:

    cxDesired:指定图标或光标的宽度,以像素为单位。如果此参数为零并且参数fuLoad值中LR_DEFAULTSIZE没有被使用,那么函数使用目前的资源宽度。

 cyDesired:指定图标或光标的高度,以像素为单位。如果此参数为零并且参数fuLoad值中LR_DEFAULTSIZE没有被使用,那么函数使用目前的资源高度。

LoadImage的返回值是相关资源的句柄。因为加载的是位图所以返回的句柄是HBITMAP型的(需要强制转换)。

 

延伸理解 HBITMAP/CBitmap/BITMAP

HBITMAPbitmap的指针,

msdn中如是:Handle to a bitmap.typedef HANDLE HBITMAP;

CBitmapmfc中封装bitmap的类;

msdn中:

Encapsulates(囊括) a Windows graphics device interface (GDI) bitmap and provides member functions to manipulate(操作) the bitmap.

BITMAP是一个结构体,封装着bitmap的一些信息。定义了逻辑位图的高,宽,颜色格式和位值。

MSDN中如是:This structure defines the type, width, height, color format, and bit values of a bitmap.

 

三者之间的关系转换:

HBITMAP hBitmap;

CBitmap bitmap;

BITMAP bm;

//下面是三者之间的联系:

bitmap.Attach(hBitmap);//HBITMAP 得到关联的CBitmap

bitmap.GetBitmap(&bm); // CBitmap 得到关联的BITMAP 
hBitmap=(HBITMAP)bitmap.GetSafeHandle();//CBitmap得到相关的HBITMAP

 

BITMAP结构具有如下形式:
typedef struct tagBITMAP

     int      bmType;
     int      bmWidth;//

     int      bmHeight;//

     int      bmWidthBytes;
     BYTE     bmPlanes;
     BYTE     bmBitsPixel;
     LPVOID bmBits;
 BITMAP;

 

延伸理解下Attach/Detach

  attach是把一个C++对象与一个WINDOWS对象关联,直到用detach则把关联去掉。  
  
如果attach了以后没有detach,则C++对象销毁的时候WINDOWS对象跟着一起完蛋。  
  attach
了以后,C++对象的指针和WINDOWS对象的HWND会有一个映射关系,其作用相当于你直接用一个C++对象去Create一个WINDOWS对象,例如   CEdit  edit;   edit.create(...)  
  
并且此映射是永久的,知道此对象完蛋为止。  
  
如果用类似GetDlgItem函数也可以返回一个指针,并可以强制转换。GetDlgItem会到映射表里找。  
  
2种映射表,一中是永久的,一种是临时的。  
  
直接用C++对象创建的WINDOWS对象或者是通过attach的对象的映射关系都被放到永久表中,否则就在临时表中创建映射。  
  
所以GetDlgItem不推荐你保存返回的指针,因为你很难保证你的WINDOWS对象跟C++对象的关联是否放在永久表中。  
  
如果映射是放在临时表中,那么在空闲时间会被自动删除。  
  
attcah完全是为了方便用MFC类的成员函数去操纵WINDOWS对象。 


http://blog.sina.com.cn/s/blog_af68a2c201019iuc.html

你可能感兴趣的:(最终--VC中MFC如何显示位图(拉伸以及非拉伸))