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显示图片

}

StretchBlt函数和BitBlt函数的用法的更多相关文章

  1. BitBlt 函数 详解, StretchBlt、SetStretchBltMode、SetBrushOrgEx 按句柄截图、直接截取缩略图

    BitBlt 该函数对指定的源设备环境区域中的像素进行位块(bit_block)转换,以传送到目标设备环境. 函数原型 [DllImport("gdi32.dll")] publi ...

  2. MFC函数之BitBlt

    MFC函数之BitBlt // Cgame123View 绘制 void Cgame123View::OnDraw(CDC* pDC) { Cgame123Doc* pDoc = GetDocumen ...

  3. Python中的map()函数和reduce()函数的用法

    Python中的map()函数和reduce()函数的用法 这篇文章主要介绍了Python中的map()函数和reduce()函数的用法,代码基于Python2.x版本,需要的朋友可以参考下   Py ...

  4. 转: ES6异步编程: co函数库的含义与用法

    转: ES6异步编程: co函数库的含义与用法 co 函数库是著名程序员 TJ Holowaychuk 于2013年6月发布的一个小工具,用于 Generator 函数的自动执行. 比如,有一个 Ge ...

  5. matlab sparse函数和full函数用法详解(转)

    sparse函数 功能:Create sparse matrix-创建稀疏矩阵 用法1:S=sparse(X)--将矩阵X转化为稀疏矩阵的形式,即矩阵X中任何零元素去除,非零元素及其下标(索引)组成矩 ...

  6. Python3 join函数和os.path.join用法

    Python3  join函数和os.path.join用法 os.path.join()连接两个文件名地址的时候,就比os.path.join("D:\","test. ...

  7. 数据仓库之抽取数据:openrowset函数带bulk操作符的用法

    原文:数据仓库之抽取数据:openrowset函数带bulk操作符的用法 在做数据仓库时,最重要的就是ETL的开发,而在ETL开发中的第一步,就是要从原OLTP系统中抽取数据到过渡区中,再对这个过渡区 ...

  8. java中Map的put函数和get函数用法

    ---内容开始--- 没有比较完整的说明他们的用法,一般就只能看源函数,但是看起来比较的费劲. 那么究竟put函数和get函数的用法是如何的呢? 当然java中的Map集合是有Key和Value的. ...

  9. Python函数装饰器原理与用法详解《摘》

    本文实例讲述了Python函数装饰器原理与用法.分享给大家供大家参考,具体如下: 装饰器本质上是一个函数,该函数用来处理其他函数,它可以让其他函数在不需要修改代码的前提下增加额外的功能,装饰器的返回值 ...

随机推荐

  1. Mysql的“Table 'mysql.servers' doesn't exist”的解决方法

    安装MYSQL后,又一次系统出现问题了,于是我查看mysql的错误日志,竟发现Table 'mysql.servers' doesn't exist问题的错误, 虽然与我的问题无关,但这个问题还是引起 ...

  2. centos7 安装 elasticsearch

    安装java环境 这里使用yum方式安装,前提是必须有网络 yum install java-1.8.0-openjdk 安装完成,查看java版本 [root@localhost ~]# java ...

  3. 一些部署django用到的linux命令

    mv untitled45/ /1601F/wang/ 将XXXX移动到XXX,也可以用于给XXX重新命名 zip -r -q -o hello.zip  /1601F/3/untitled45 安静 ...

  4. nc工具用法

    http://man.linuxde.net/nc_netcat nc命令用法举例 什么是nc

  5. ROS创建Web代理(Web proxy)给QQ使用HTTP代理

    使用Web代理可以提高网页的访问速度,因为访问的数据会存储在内存或是硬盘中,就会直接从代理服务器中读取.同时,为了提高网络访问的安全性,可以给Web代理服务器设置相应的权限,使它的安全性得到提高. 下 ...

  6. PHP扩展类ZipArchive实现压缩解压Zip文件和文件打包下载 && Linux下的ZipArchive配置开启压缩 &&搞个鸡巴毛,写少了个‘/’号,浪费了一天

    PHP ZipArchive 是PHP自带的扩展类,可以轻松实现ZIP文件的压缩和解压,使用前首先要确保PHP ZIP 扩展已经开启,具体开启方法就不说了,不同的平台开启PHP扩增的方法网上都有,如有 ...

  7. Hive中创建结构体、数组以及map

    ROW FORMAT DELIMITED 分隔符设置开始语句 FIELDS TERMINATED BY:设置字段与字段之间的分隔符 COLLECTION ITEMS TERMINATED BY:设置一 ...

  8. python + docker, 实现天气数据 从FTP获取以及持久化(三)-- python获取FTP数据

    前言 经过前面两个小节的介绍,我们已经完成了MySQL数据库的搭建和数据库操作的事宜. 在本小节中,我们需要完成的任务是:使用python从FTP服务其上面获取文本文件. 搭建测试FTP服务器 LZ的 ...

  9. nginx收到空包问题

    tcpdump有收包,但是nginx的access.log显示post数据为空 可以通过tcpdump监控端口 http://www.cnblogs.com/linn/p/4792468.html 修 ...

  10. lookup 控件

    lookup->ADOQuery->Connection = DataModule1->ADOConnection1; lookup->ADOQuery->SQL-> ...