DoubleLi

qq: 517712484 wx: ldbgliet

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  4737 随笔 :: 2 文章 :: 542 评论 :: 1615万 阅读
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

使用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

posted on   DoubleLi  阅读(4365)  评论(0编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
历史上的今天:
2013-05-04 VC++实现非窗口类中使用定时器的方法
2013-05-04 VC中动态加载ODBC解决方法
2013-05-04 VC++数据库开发技术的比较
2013-05-04 VC++程序编译链接的原理与过程
2013-05-04 关于Visual C++ 6.0的调试技巧和经验总结
2013-05-04 用Visual C++制作微秒级精度定时器
2013-05-04 CreateWaitableTimer和SetWaitableTimer函数
点击右上角即可分享
微信分享提示