MFC中GDI之CBitmap(位图)

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:将源矩形区域直接拷贝到目标矩形区域。)

                      

常记溪亭日暮,沉醉不知归路。兴尽晚回舟,误入藕花深处。争渡,争渡,惊起一滩鸥鹭。

昨夜雨疏风骤,浓睡不消残酒。试问卷帘人,却道海棠依旧。知否?知否?应是绿肥红瘦。
原文地址:https://www.cnblogs.com/htj10/p/11953880.html