CBitmap类主要是加载位图资源,或者建立一个空白位图用于存储画面。
BOOL LoadBitamp(UINT nIDResource) | 从工程资源中加载一张位图 |
BOOL LoadOEMBitmap(UINT nIDBitmap) | 从系统资源中加载一张位图 |
BOOL CreateBitmap(int nWidth, int nHeigjt, UINT nPlane, UINT nBitCnt, const void* lpBits) | 根据指定的值创建一张位图 |
BOOL CreateCompatibleBitmap(CDC* pDC, int nWidth, int nHeight) | 根据高宽创建一张兼容位图 |
BOOL CreateBitmapIndirect(LPBITMAP lpBitmap) | 根据BITMAP结构体创建一张空白位图 |
int GetBitamp(BITMAP* pBitmap) | 根据BITMAP结构体获取位图属性信息 |
static CBitmap* FromHandle(HBITMAP hBitmap) | 将HBITMAP句柄转换为CBitamp对象 |
operator HBITMAP() const | 从CBitmap对象中获取HBITMAP句柄 |
BITMAP结构体:
/* Bitmap Header Definition */ typedef struct tagBITMAP { LONG bmType; LONG bmWidth; LONG bmHeight; LONG bmWidthBytes; WORD bmPlanes; WORD bmBitsPixel; LPVOID bmBits; } BITMAP, *PBITMAP, NEAR *NPBITMAP, FAR *LPBITMAP;
装载位图并显示:
① 位图装载 CBitamp::LoadBitmap
② 创建兼容的内存DC CDC::CreateCompatibleDC
③ 内存DC选择位图对象 CDC::SelectObject
④ 使用贴图函数显示内存DC中的位图内容 CDC::BitBlt
注:若使用压缩或拉伸原始图片则使用 CDC::StretchBlt
例子:
void CMFC7_7BitmapDlg::OnPaint() { CPaintDC dc(this); // device context for painting myBitmap(&dc); } void CMFC7_7BitmapDlg::myBitmap(CDC *pDC) { CBitmap bmp; bmp.LoadBitmap(IDB_WOLF); BITMAP bm; bmp.GetBitmap(&bm);// 获得位图的详细信息 CDC mdc; mdc.CreateCompatibleDC(pDC);//创建兼容DC mdc.SelectObject(&bmp);//选择位图对象 pDC->BitBlt(0,0,bm.bmWidth,bm.bmHeight, &mdc, 0,0,SRCCOPY);//贴图 // 压缩或拉伸 pDC->SetStretchBltMode(HALFTONE); // 设置压缩拉伸方式,效果好 pDC->StretchBlt(bm.bmWidth,0,bm.bmWidth/2,bm.bmHeight/2, &mdc,0,0,bm.bmWidth,bm.bmHeight,SRCCOPY);//压缩 pDC->StretchBlt(bm.bmWidth*2,0,bm.bmWidth*2,bm.bmHeight*2, &mdc,0,0,bm.bmWidth,bm.bmHeight,SRCCOPY);//拉伸 pDC->StretchBlt(0,bm.bmHeight,bm.bmWidth,bm.bmHeight, &mdc,bm.bmWidth,0,-bm.bmWidth,bm.bmHeight,SRCCOPY);//左右翻转 pDC->StretchBlt(0,bm.bmHeight*2,bm.bmWidth,bm.bmHeight, &mdc,0,bm.bmHeight,bm.bmWidth,-bm.bmHeight,SRCCOPY);//上下翻转 pDC->StretchBlt(0,bm.bmHeight*3,bm.bmWidth,bm.bmHeight, &mdc,bm.bmWidth,bm.bmHeight,-bm.bmWidth,-bm.bmHeight,SRCCOPY);//左右上下翻转 }
BitBlt 用于从原设备中复制位图到目标设备,语法格式如下: BOOL BitBlt(int x,int y,int nWidth,int nHeight,CDC* pSrcDC,int xSrc,int ySrc,DWORD dwRop); 返回值:如果函数成功,那么返回值非零;如果函数失败,则返回值为零。 x:指定目标矩形区域左上角的X轴逻辑坐标。 y:指定目标矩形区域左上角的Y轴逻辑坐标。 nWidth:指定源在目标矩形区域的逻辑宽度。 nHeight:指定源在目标矩形区域的逻辑高度。 hSrcDC:指向源设备环境的句柄。 xSrc:指定源矩形区域左上角的X轴逻辑坐标。 ySrc:指定源矩形区域左上角的Y轴逻辑坐标。 dwRop:指定光栅操作代码。这些代码将定义源矩形区域的颜色数据,如何与目标矩形区域的颜色数据组合以完成最后的颜色。 下面列出了一些常见的光栅操作代码: BLACKNESS:表示使用与物理调色板的索引0相关的色彩来填充目标矩形区域,(对缺省的物理调色板而言,该颜色为黑色)。 DSTINVERT:表示使目标矩形区域颜色取反。 MERGECOPY:表示使用布尔型的AND(与)操作符将源矩形区域的颜色与特定模式组合一起。 MERGEPAINT:通过使用布尔型的OR(或)操作符将反向的源矩形区域的颜色与目标矩形区域的颜色合并。 NOTSRCCOPY:将源矩形区域颜色取反,于拷贝到目标矩形区域。 NOTSRCERASE:使用布尔类型的OR(或)操作符组合源和目标矩形区域的颜色值,然后将合成的颜色取反。 PATCOPY:将特定的模式拷贝到目标位图上。 PATPAINT:通过使用布尔OR(或)操作符将源矩形区域取反后的颜色值与特定模式的颜色合并。然后使用OR(或)操作符将该操作的结果与目标矩形区域内的颜色合并。 PATINVERT:通过使用XOR(异或)操作符将源和目标矩形区域内的颜色合并。 SRCAND:通过使用AND(与)操作符来将源和目标矩形区域内的颜色合并。 SRCCOPY:将源矩形区域直接拷贝到目标矩形区域。 SRCERASE:通过使用AND(与)操作符将目标矩形区域颜色取反后与源矩形区域的颜色值合并。 SRCINVERT:通过使用布尔型的XOR(异或)操作符将源和目标矩形区域的颜色合并。 SRCPAINT:通过使用布尔型的OR(或)操作符将源和目标矩形区域的颜色合并。 WHITENESS:使用与物理调色板中索引1有关的颜色填充目标矩形区域。(对于缺省物理调色板来说,这个颜色就是白色)。
BOOL StretchBlt( int x, int y, int nWidth, int nHeight, CDC* pSrcDC, int xSrc, int ySrc, int nSrcWidth, int nSrcHeight, DWORD dwRop ); x:逻辑单元x轴左上角坐标; (获取图像控件的DC后,该值一般设为 0 ) y:逻辑单元y轴左上角坐标; (获取图像控件的DC后,该值一般设为 0 ) nWidth: 设备矩形宽度;(即是图像控件的宽度,通过int rcWidth = rc.right - rc.left;来获得,rc为保存了图像控件矩形区坐标信息) nHeight:设备矩形高度; (即是图像控件的高度,通过int rcHeight = rc.bottom - rc.top;来获得) pSrcDC: 源设备上下文; (就是我们定义的内存DC,然后取地址) xSrc :源矩形x轴左上角坐标; (一般都是整幅图片拷贝,所以该值为 0 ) ySrc: 源矩形y轴左上角坐标; (一般都是整幅图片拷贝,所以该值为 0 ) Specifies the x-coordinate (in logical units) of the upper-left corner of the source rectangle. nSrcWidth:源矩形宽度;(如果我们定义了一个结构体BITMAP类型m_bmp保存位图信息,那么可以用m_bmp.bmWidth获取宽度) nSrcHeight:源矩形高度 ( 如果我们定义了一个结构体BITMAP类型m_bmp保存位图信息,那么可以用m_bmp.bmHeight获取宽度) dwRop:指定要进行的光栅操作。(这个有很多选择,我们一般选择SRCCOPY:将源矩形区域直接拷贝到目标矩形区域。)