MFC中的位图操作,涉及三个概念:CBitmap,HBitmap,BITMAP.
1.BITMAP是位图的基本数据结构,封装位图信息,包括颜色,大小,位值,数据等
typedef struct tagBITMAP { int bmType; int bmWidth; //宽 int bmHeight; //高 int bmWidthBytes; BYTE bmPlanes; BYTE bmBitsPixel; LPVOID bmBits; } BITMAP;
2.HBitmap是位图句柄,可以通过API函数LoadImage加载文件得到,LoadImage得到的句柄为通用类型即,HANDLE.需要转换成具体的资源类型,如:
HBITMAP hBitmap = (HBITMAP)::LoadImage(NULL, _T("1.bmp"), IMAGE_BITMAP, 0, 0, //原始大小 LR_DEFAULTCOLOR | LR_CREATEDIBSECTION | LR_LOADFROMFILE); //或者另外一个API函数,此函数仅从资源中加载位图 HBITMAP hBitmap = ::LoadBitmap(AfxGetApp()->m_hInstance, MAKETRESOURCE(IDB_BITMAP1);
3.CBitmap是对BITMAP进行类的封装.
CBitmap有两个重载的成员函数:
BOOL LoadBitmap( LPCTSTR lpszResourceName ); //从硬盘加载位图
BOOL LoadBitmap( UINT nIDResource ); //从资源加载位图
调用方法如下:
CBitmap m_bitmap; m_bitmap.LoadBitmap(_T("1.bmp"));//从文件加载
三者之间的转换关系:
HBITMAP hBitmap; CBitmap m_bitmap; BITMAP bm; //下面是三者之间的联系: m_bitmap.Attach(hBitmap);//HBITMAP句柄关联到CBitmap hBitmap=(HBITMAP)m_bitmap.GetSafeHandle();//由CBitmap得到相关的HBITMAP m_bitmap.GetBitmap(&bm); //由CBitmap得到关联的BITMAP
要显示位图,这三者都会用到,如下:
CBitmap m_Bitmap;//位图类加载 m_Bitmap.LoadBitmap(_T("1.bmp")); CDC MemDC; //创建位图DC MemDC.CreateCompatibleDC(NULL); MemDC.SelectObject(&m_Bitmap); CPaintC dc(this); BITMAP BM; //位图信息 m_Bitmap.GetObject(sizeof(BM),&BM); dc.BitBlt ( 0,0, //目标设备逻辑横、纵坐标 BM.bmWidth,BM.bmHeight, //显示位图的像素宽、高度 &MemDC, //待显示位图数据的设备情境对象 0,0, //源数据中的横、纵坐标 SRCCOPY); //位操作方式
原文地址:http://9233403.blog.51cto.com/9223403/1974474