自绘效率曲线控件

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

时间: 2024-08-03 11:01:09

自绘效率曲线控件的相关文章

edit-MFC自绘EDIT控件和Text控件。怎么消除先前的文字?

问题描述 MFC自绘EDIT控件和Text控件.怎么消除先前的文字? 把EDIT和TEXT设成透明色,和窗口背景一样.1.SetWindowText 和以前的文字重叠. 2.按退格建删除文字,以前的文字还在EDIT里面,再次输入还是重叠.怎么解决? 解决方案 没办法,只能请教老师了 解决方案二: MFC控件自绘-Static TextEDIT控件自绘MFC中如何从EDIT控件中获取文字 解决方案三: 应该是没有把对应的控件内容清空或者是否没有引起界面重绘 解决方案四: 没办法,只能请教老师了

MFC自绘控件学习总结

前言:从这学期开始就一直在学习自绘控件(mfc),目标是做出一款播放器界面,主要是为了打好基础,因为我基础实在是很烂....说说我自己心得体会以及自绘控件的方法吧,算是吐槽吧,说的不对和不全的地方,或者有更好的方法,请不吝赐教. 我的机器环境是:Windows7旗舰版 Service Pack 1,Visual studio 2005 1).重绘某个控件时,强烈推荐使用子类化方法,比如想自绘Button控件, 首先添加自己的类CMYButton 继承自 CButton ,声明一个CMYButto

标准控件的使用技巧与自绘控件

在您决定开发 Windows 提供的常规免费自定义控件范围之外的控件之后,您必需确定自己的控件将有多少独到之处 - 在功能和外观两方面.例如,我们假定您正在创建一个类似于计速表的控件.由于公共控件库 (ComCtrl32.dll) 中没有类似的控件,您完全需要自己进行以下操作:编写所有控件功能需要的代码,进行绘制,默认终端用户的交互,以及控件与其父窗口之间需要的任意消息处理. (#add 两方面,公共控件库中没有类似的 完全重写;  只想调整公共控件功能,则可以部分修改) 另一方面,还包括一些您

MFC基础,MFC自绘控件学习总结.---转

前言:从这学期开始就一直在学习自绘控件(mfc),目标是做出一款播放器界面,主要是为了打好基础,因为我基础实在是很烂....说说我自己心得体会以及自绘控件的方法吧,算是吐槽吧,说的不对和不全的地方,或者有更好的方法,请不吝赐教. 我的机器环境是:Windows7旗舰版 Service Pack 1,Visual studio 2005 1).重绘某个控件时,强烈推荐使用子类化方法,比如想自绘Button控件, 首先添加自己的类CMYButton 继承自 CButton ,声明一个CMYButto

自绘控件的子类化方法

  1.       新建一个基于对话框的MFC程序. 2.       在工程中添加一个新类CMyButton,基类选择CButton. 3.       然后转至新生成的MyButton.h头文件中,将鼠标放在类名CMyButton上点击一下,打开"属性"窗口,在"消息"按钮下为此类添加 WM_LBUTTONDOWN,WM_LBUTTONUP消息,并重写DrawItem虚函数(这个函数是重绘按钮时要调用的,在这里面可以自定义一些绘制按钮的操作,必须设置控件属性为

急...重绘控件拖动窗体时,只要控件部分被掩盖了就会出现残影这样的问题,请教好何解决!!!

问题描述 [img=///:QQPCmgr桌面][/img] 解决方案 解决方案二:该回复于2012-03-21 20:28:09被版主删除解决方案三:该回复于2012-03-21 20:28:14被版主删除解决方案四:该回复于2012-03-21 20:28:15被版主删除解决方案五:具体问题具体分析,图....解决方案六:本地图传不上去,就是重绘的控件,当窗体被别的窗体覆盖时,再把别的窗体拖走,控件就不成样子了

vb.net的GroupBox控件

GroupBox(控件组)控件一般是作为其他控件的组的容器的形式存在的,这样有利于用户识别,使界面变得更加友好(GroupBox控件相当于Visual Basic以前版本的Frame控件).使用控件组控件可以将一个窗体中的各种功能进一步进行分类,例如,将各种选项按钮控件分隔开.在大多数情况下,对控件组控件没有实际的操作.我们用它对控件进行分组,通常没有必要响应它的事件.不过,它的Name.Text和Font等属性可能会经常被修改,以适应应用程序在不同阶段的要求.GroupBox控件在工具箱中的图

如何避免多控件窗体重新布局时闪烁

适用场景: 需要在某容器控件中动态装载多个子控件,而且该容器控件可能需要改变WindowFormState,即从Normal转变为Maxmized,或者是其他状态转换啦, what ever :) 如果没有应用任何特殊处理,你就会发现,当容器控件状态转换时,其上的子控件在经过一阵狂闪之后(可能背景控件颜色和自身相互交替出现),最终恢复至平静; 这种情形当然无论是程序员自己和客户都不愿意看到的 ok,废话一通之后,咱们开始解释原因,以及考虑解决方案 为什么会闪烁? 因为窗体控件状态转换时,wind

c++-vc中写好的程序怎么利用控件

问题描述 vc中写好的程序怎么利用控件 我用vc建了个普通的Win32 Console Application工程,代码已写好.但我想用写好的代码利用控件画曲线图,所以我建了个MFC AppWizards[exe]工程,并在里面插入了控件ntgraph,按照网上教程,我在OnInitDialog函数里面写了个简单的显示三角波的程序,并运行成功.但现在我要把我工程里面的代码和控件结合,让曲线显示出来,那该怎么办? 解决方案 for(int xx = 0;xx<1000;xx+=10) //这是我自