CDC的LineTo()函数停止点

本篇文章简单。

一、引子

vs2015, mfc

最近几天在弄个小程序,用来显示声音的波形图。由于一些文件较大,得有几十MB,所以在画波形图时很慢,为了提高效率,采用了如下思路:

由于采样数很多,所以画出来后,屏幕上的一个像素点就对应了多个采样点的线条,所以对它进行修改,把每个像素点对应的采样分为一组,然后对这个组中查找最大值和最小值,这样一个像素点就只需要画一条线,效率大大提高。画出来的结果总体上不错,但仔细看,中间有些空白,没有连续,如下图所示的B点:

为了看清楚,上图是放大8倍时的情况,B点明显是断开的,实际应该要达到像A点那样,是连起来的状态才对。

 

二、问题解决

由于这里面只用到了CDC的画线,所以其问题肯定就是出在了 LineTo()的函数上。首先就是要先确定画的坐标是否正确,通过跟踪发现,坐标没错,B点确实是(253,33)。

其实一下子就想到,肯定是声音很小的时候,这个位置应该是一条线,即显示声音值为0的状态。通过仔细对比,确实如此。

根据前面说的画图方式,取得每个像素点的最大值和最小值,然后画一条线即可。在声音很小的时候,最大值和最小值对应的坐标就一样了,比如上图中B点,它的两个坐标都是(253,33),则画图时就成了这样子:

dcMem.MoveTo(253,33);
dcMem.LineTo(253,33);

正常应该画个点出来呀,但实事证明,它没有画出来任何东西,就是一个空白!为了解决这个问题,在画线之前先判断两个坐标点是否一样,如果一样就画点:

dcMem.SetPixel(253,33,RGB(0,0,0));

这样修改之后,问题解决。

三、结论

根据以上描述,得出这样的结论:

CDC::LineTo()所画的点,是不包括结束的那个点。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值