DrawDibDraw函数的使用方法

简介: 使用windows的的自带的函数来显示图像可能始终还是绕不开两个概念, 视口和窗口。 视口--- 屏幕上的一个显示用的矩形框。 窗口--- 完整图像上的一个用于取数的矩形框。  屏幕的宽度、高度和视口参数用于控制向显示存储器中写数。

使用windows的的自带的函数来显示图像可能始终还是绕不开两个概念,

视口和窗口。

视口--- 屏幕上的一个显示用的矩形框。

窗口--- 完整图像上的一个用于取数的矩形框。 

屏幕的宽度、高度和视口参数用于控制向显示存储器中写数。

图像的宽度、高度和窗口参数用于控制从图像文件中取数。

利用DrawDibDraw函数可以实现视频显示和单帧图像的显示,而且对于显示图像的移动和放缩,也可以轻松实现。但是在实际的显示中可能都会把屏幕的概念利用GetClientRect()换成客户区。因为图像总是在客户区进行显示。为了让图像正常显示(即不经过缩放),那么窗口的大小必定和视口的大小是完全相同的,只是窗口的起始点和视口的起始点坐标标准是不一样的,所以这两点坐标显然是不一样的。

 

 

 

例如rc即为我们设的客户区的CRect类的对象,这里我们假设视口的大小等于客户区的大小。

DrawDibDraw(m_hDrawDib,
      m_hDC,

             //视口
      rc.left,//目的图像的横坐标在客户区的横坐标起始,视口的横坐标起始
      rc.top,//目的图像的纵坐标在客户区的纵坐标起始,视口的纵坐标起始
      rc.Width(),//目的图像的宽度,视口的图像宽度
      rc.Height(),//目的图像的高度,视口的图像高度


      &(m_pBmpInfo->bmiHeader),
      m_pSourceDat,//整幅图像的数据起始首地址

             //窗口
      dxs,//源图像的横坐标起始,窗口横坐标起始
      dys,//源图像的纵坐标起始,窗口纵坐标起始
      rc.Width(),//源图像的宽度,窗口宽度
      rc.Height(),//源图像的高度,窗口高度
      0);
这样就可以正常显示一副图像了,而且随着dxs和dys的改变,可以改变窗口取数的位置,从而显示的是移动后的图像。

 

 

DrawDibDraw

 

这个函数将DIB绘至屏幕。

 

BOOL DrawDibDraw(

HDRAWDIB hdd,

HDC hdc,

int xDst,

int yDst,

int dxDst,

int dyDst,

LPBITMAPINFOHEADER lpbi,

LPVOID lpBits,

int xSrc,

int ySrc,

int dxSrc,

int dySrc,

UINT wFlags

);

参数

hdd DrawDib DC的句柄。

hdc DC的句柄。

xDstyDst MM_TEXT坐标系,目标矩形左上角的xy坐标。

dxDstdyDst MM_TEXT坐标系下,目标矩形的宽度和高度。如果dxDst-1,则使用位图的宽度;如果dyDst-1,则使用位图的高度。

lpbi 包含图象格式的BITMAPINFOHEADER结构的地址。DIB的颜色表紧跟着格式后,并且biHeight成员必须为正值;DrawDibDraw不能绘制倒置的DIB

lpbits 包含位图位的缓冲的地址。

xSrcySrc 以象素为单位,源矩形左上角的xy坐标。坐标(00)是位图的左上角。

dxSrcdySrc 以象素为单位,源矩形的宽度和高度。

wFlags 可用的绘图标志。如下值被定义:

DDF_BACKGROUNDPAL 实现作为背景的调色板,保留当前显示所使用的调色板不变。这个值只有当DDF_SAME_HDC未被设置时才有效。

DDF_DONTDRAW 当前图象已解压但未绘。这个标志取代了DDF_PREROLL标志。

DDF_FULLSCREEN 不被支持。

DDF_HALFTONE 不管DIB的调色板如何而把DIB抖动成标准调色板。如果应用程序使用了DrawDibBegin,在DrawDibBegin中设置而不在DrawDibDraw中。

DDF_HURRYUP 数据并不需要被绘(它可以被绘)并且DDF_UPDATE不用理会这个信息。DrawDib只有当需要去构建另一帧时才检查这个值;否则,这个值被忽略。

这个值通常用来同步视频和音频。当同步数据时,应用程序应当用这个值发送图象以防止驱动器需要缓冲帧来解压后续帧。

DDF_NOTKEYFRAME DIB数据不是关键帧。

DDF_SAME_HDC 使用当前DC句柄以及与当前句柄相关联的调色板。

DDF_SAME_DRAW DrawDibDraw使用当前的绘制参数。只有当从使用DrawDibDrawDrawDibBegin起,lpbidxDextdyDestdxSrcdySrc就未改变才用这个值。DrawDibDraw经常检查这些参数,如果它们改变了,DrawDibBegin则准备绘图的DrawDib DC。这个标志取代了DDF_SAME_DIBDDF_SAME_SIZE标志。

DDF_UPDATE 最后缓存的图象需要绘制。如果用这个值绘制失败,则缓冲的图象不在有效,并且在显示被更新前,需要指定一幅新的图象。

返回值

成功返回TRUE,否则FALSE

注 DDF_DONTDRAW使DrawDibDraw解压但不显示一幅图象。一个调用DrawDibDraw的序列是指定DDF_UPDATE来显示图象。

如果DrawDib DC没有指定一个屏幕缓冲,指定DDF_DONTDRAW会造成这帧被立即绘到屏幕。序列调用DrawDibDraw指定DDF_UPDATE会失败。

尽管DDF_UPDATDDF_DONTDRAW可以在不同时间设置,它们可以一起用来创建脱屏图象。当脱屏图象完成后,可以调用DrawDibDraw来显示图象。

 

http://blog.donews.com/zwell/archive/2004/09/24/108517.aspx

目录
相关文章
|
10月前
|
自然语言处理 并行计算 数据可视化
免费开源法律文档比对工具:技术解析与应用
这款免费开源的法律文档比对工具,利用先进的文本分析和自然语言处理技术,实现高效、精准的文档比对。核心功能包括文本差异检测、多格式支持、语义分析、批量处理及用户友好的可视化界面,广泛适用于法律行业的各类场景。
462 1
|
11月前
|
Web App开发 安全 Linux
远程控制软件
远程控制软件介绍
278 5
|
存储 Ubuntu
Ubuntu查看系统日志的几种方法
Ubuntu查看系统日志的几种方法
|
存储 编译器 Linux
【C++】float / double 与 0 值比较
使用普通的比较没有问题,如果考虑精度的话,需要与具体的值比较
1489 0
【C++】float / double 与 0 值比较
|
运维 安全 Linux
【运维知识进阶篇】手把手教你搭建OpenVPN(保姆级教程)(一)
【运维知识进阶篇】手把手教你搭建OpenVPN(保姆级教程)
16413 2
|
SQL 安全 关系型数据库
MySQL超详细安装教程 手把手教你安装MySQL到使用MySQL 最简单的MySQL安装方式,这种方式装,卸载也简单(零基础入门MySQL)
Mysql是我们现在常用的数据库,可是安装和卸载成为很多新手头疼的问题。所以我想用这篇文章解决大家安装与卸载的难题
1129 1
MySQL超详细安装教程 手把手教你安装MySQL到使用MySQL 最简单的MySQL安装方式,这种方式装,卸载也简单(零基础入门MySQL)
|
编解码 算法 安全
实测办公场景下,国产远程控制软件的表现力如何?(技术解析)
大家好,我是码农飞哥,作为一个常年混迹职场的老码农。我在工作和生活中碰到了很多问题,也帮助别人解决了很多问题。前有帮实习生配环境,后有帮同事调BUG,中间还有教老爸如何使用手机。
315 0
实测办公场景下,国产远程控制软件的表现力如何?(技术解析)
|
存储 API 图形学
OpenCV_11 轮廓检测:图像的轮廓+绘制轮廓+轮廓近似+边界矩形+椭圆拟合+直线拟合
轮廓检测指检测图像中的对象边界,更偏向于关注上层语义对象。如OpenCV中的findContours()函数, 它会得到每一个轮廓并以点向量方式存储,除此也得到一个图像的拓扑信息,即一个轮廓的后一个轮廓、前一个轮廓等的索引编号。
2948 0
|
前端开发 编译器 iOS开发
Clang代码覆盖率检测(插桩技术)
Clang的全称是C Language Family Frontend for LLVM,即基于LLVM的C系列语言的前端编译器。iOS应用的前端编译,即是采用Clang完成的。本篇文章,我们主要介绍Clang内置的一个简单的代码覆盖率检测功能,对于iOS开发来说,此功能更多用于Objective-C的方法插桩,为二进制重排提供支持,优化应用启动速度。但代码覆盖率检测功能并不仅仅只能应用与二进制重排,其本质是对于函数级、基本块级或代码边缘级插入回调,我们可以基于这一原理更灵活的实现所需要的功能。
1519 0
|
域名解析 Ubuntu 编译器
如何在 Ubuntu 20.04 上安装 GCC(build-essential)
GNU 编译器集合是一系列用于语言开发的编译器和库的集合,包括: C, C++, Objective-C, Fortran, Ada, Go, and D等编程语言。很多开源项目,包括 Linux kernel 和 GNU 工具,都是使用 GCC 进行编译的。本文主要为大家讲解如何在 Ubuntu 20.04 上安装 GCC。
96189 4
如何在 Ubuntu 20.04 上安装 GCC(build-essential)