zoukankan      html  css  js  c++  java
  • StretchBlt函数和BitBlt函数的用法

    StretchBlt和BitBlt都用在双缓冲视图中,用来显示一幅图像

    一、StretchBlt

    函数从源矩形中复制一个位图到目标矩形,必要时按目标设备设置的模式进行图像的拉伸或压缩。也即是将内存中的位图拷贝到屏幕上,并且可以根据屏幕画图区的大小来进行伸缩,适应响应的屏幕(或图像控件)


     

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

    二、BitBlt函数

    该函数对指定的源设备环境区域中的像素进行位块(bit_block)转换,以传送到目标设备环境。

     

    CDC::BitBlt 

    BOOL BitBlt( int x, int y, int nWidth, int nHeight, CDC* pSrcDC, int xSrc, int ySrc, DWORD dwRop );

    BitBlt函数和上面的STretchBlt函数的参数基本上差不多,只是少了倒数第二个和倒数第三个参数:

    nSrcWidth:源矩形宽度; 以及,nSrcHeight:源矩形高度 

    前面四个参数也是和目标矩形(也即是我们的图像控件区域)相关的,如果是图像控件的话,起点坐标也是(0,0),终点坐标就是矩形区的宽度和高度;

    对于源矩形区域(指内存DC中的位图),只需要给出拷贝的起点即可,

    BitBlt函数不会对原来的位图进行拉伸或压缩,只会根据我们给定的nWidth,nHeight 值来决定该有多少部分进行显示




    下面一段代码给出了这两个函数的具体用法:

    void CEnvirMonibeta1View::ShowBitmap(CDC *pDC, CString TotalName, const RECT &rc)
    {
    //显示图片函数LoadImage  根据位图(或图片)的全路径名TotalName加载图片
    HBITMAP m_hBitmap;
    m_hBitmap = (HBITMAP)                                      LoadImage(NULL,TotalName,IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_DEFAULTSIZE|LR_CREATEDIBSECTION);
    // 之前在类中定义了一个CBitmap 类的对象m_bitmap,
    if( m_bitmap.m_hObject )
    {
    m_bitmap.Detach();            //m_bitmap为创建的位图对象
    }
    m_bitmap.Attach(m_hBitmap);   // 让位图对象m_bitmap 和我们加载的位图相关联(加载进来的位图只要提供一个位图句柄就可以)

    //定义并创建一个内存设备环境
    CDC  m_dcMemory;
    if( !m_dcMemory.CreateCompatibleDC(pDC) )   //创建兼容性的DC
    return;


     //定义一个位图结构体,将图片信息保存在位图结构体中
    BITMAP bitmap;
    m_bitmap.GetBitmap(&bitmap);           

    CBitmap *pbmpOld = NULL;
    m_dcMemory.SelectObject(&m_bitmap);         //将位图选入临时内存设备环境

    //获取屏幕画图区域(图像控件)的宽度和高度
    int rcWidth = rc.right - rc.left;
    int rcHeight = rc.bottom - rc.top;

    //图片显示调用函数BitBlt
    pDC->BitBlt(0,0,rcWidth,rcHeight,&dcBmp,0,0,SRCCOPY);
           // 如果希望图片和矩形区域能自动适配,可以用下面的函数
    // pDC->StretchBlt(0,0,rcWidth,rcHeight,&dcBmp,0,0,bitmap.bmWidth,bitmap.bmHeight,SRCCOPY);

    //下面是一些善后工作
    dcBmp.SelectObject(pbmpOld);           //恢复临时DC的位图
    DeleteObject(&m_bitmap);//删除位图
    dcBmp.DeleteDC();//删除后台DC
    // Invalidate();    //一直调用OnDraw显示图片


    }

  • 相关阅读:
    打开安装 好的Microsoft Dynamics CRM 4.0 报错误为 Caller does not have enough privilege to set CallerOriginToken to the specified value 的解决办法
    基于 Windows Server 2008 的计算机对 Microsoft Dynamics CRM 4.0 的支持
    Microsoft Dynamics CRM 4.0 如何添加自定义按钮
    Microsoft Dynamics CRM 4.0 Plugin 取值,赋值,查询
    C# 中的 enum(枚举) 类型使用例子
    vue事件的绑定
    表单验证2
    node中模块
    node模块的引入
    node中的读文件
  • 原文地址:https://www.cnblogs.com/zhaoxinshanwei/p/3851135.html
Copyright © 2011-2022 走看看