您的位置:首页 > 其它

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

2016-01-05 10:19 417 查看
简单的记一下如何显示位图:

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 LoadImage(HINSTANCE
hinst,LPCTSTR lpszName,UINT
uType,int
cxDesired,int CyDesired,UINT
fuLoad);

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

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

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

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

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

延伸理解 HBITMAP/CBitmap/BITMAP:

HBITMAP是bitmap的指针,

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

CBitmap是mfc中封装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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: