【www.gdgbn.com--班主任培训】

 

前言:这个是3月份的时候培训的小作业,做完以后觉得还是挺有趣的,所以就想了下索性放上来了,反正也没什么版权的问题,呵呵。

  这是继承自CWnd的一个自绘控件,用来显示曲线图。左边有坐标大小(根据控件内高度的每像素单位长决定,每像素单位长可自定义)标签,背景网格,曲线,还有一个显示最大最小值的小窗口(可拖动)。所有可见的颜色都可以设置更改,除了曲线外,其他所有信息和辅助线表格之类都可以做可选显示。曲线可以设置粗细。背景网格可分别设置长宽。因为使用计时器,所以让控件开始运行时,要设置好采样时间(毫秒为单位)。先看下大致Demo图形:

  左边的六个显示了可设置的属性显示效果。最右边的大控件区域就是显示完全的属性信息。这个是Debug版本的Demo程序,鼠标在曲线上的ToolTips数据会多些。由于是用Print Screen截屏,所以鼠标就消失了,不过由于做了虚线定位,所以很容易找到鼠标当前的具体位置。再看下具体的分布吧:

  这里我先分为了4个区域:A、B、C、D。A区就是用来标识坐标用的标签区域。B区就是可拖动的辅助信息显示窗口。C区就是鼠标的ToolTips信息显示。D区就是曲线和背景显示区域。注意,D区其实包括A区的后面,A区是覆盖在D区上的。

  很显然,要达到控件本身不闪烁,就必须用到双缓存的技巧。其实这个也算不上技巧啦,貌似没第二条路可走了。简单讲讲双缓存技术的原理。数据在纯内存环境中拷贝的速度要大大高于和输入输出这些低速设备交互速度。如果在控件的CDC上直接绘制的话,那将会是一个相当漫长的过程,看CPU能力了。总体来说,这么多的绘制,肯定会闪烁和巨卡的。所以要先绘制到一个和当前设备CDC环境相同的内存CDC中,这样最后要显示的时候从内存中一次性把位图拷贝出来,速度会大大提高。这样人的肉眼就不能分辨闪烁了。

  值得讲的其他一个地方就是在Dialog上的闪烁问题。开始也困扰我蛮久的,其实有个很简单的方法。先找出它闪烁的原因。因为当需要绘制图形时,总是先绘制一遍整个区域的背景色,然后再绘制区域内控件,这样控件覆盖的地方相当于是绘制了两次,如果很频繁的话,就会出现闪烁了。那如何解决呢?很简单,就是让那个重复绘制的区域不重复绘制。

本文来源:http://www.gdgbn.com/banzhurengongzuo/12989/