zoukankan      html  css  js  c++  java
  • 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:将源矩形区域直接拷贝到目标矩形区域。)
    

                          

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

    昨夜雨疏风骤,浓睡不消残酒。试问卷帘人,却道海棠依旧。知否?知否?应是绿肥红瘦。
  • 相关阅读:
    [51nod1247]可能的路径(思维题)
    天梯赛L1020 帅到没朋友(map的使用)(模拟,数组非排序去重)
    洛谷 p1030 树的遍历
    天梯赛L1046 整除光棍(模拟)
    牛客,并查集,简单dp经商
    天梯赛L1043 阅览室 模拟题
    天梯赛L1049(模拟+vector的使用)
    天梯赛L1011,简单模拟
    codeforces 1201 c
    天梯赛L2003月饼(简单排序题)
  • 原文地址:https://www.cnblogs.com/htj10/p/11953880.html
Copyright © 2011-2022 走看看