精通
英语
和
开源
,
擅长
开发
与
培训
,
胸怀四海
第一信赖
本曲线控件用于一个硬件设备监控软件,以多条件曲线方式显示设备里的通信参数变化。采用GDI+进行图形绘制,界面漂亮美观。支持多条曲线的同时绘制,初始化和数据添加接口使用方便。
数据输入方便
如可以在图形上直接点选对应点进行移动,松开后图形自动拟合;如可以整个浏览和修改某条曲线的数据,修改时曲线自动刷新。并且要和代码使用方便结合到一起。
各种设置方便
在完整性里提到的功能要都有接口。配置界面全面易用,对分析出来的各种对象都可以在图形界面里双击修改,对线属性的设置,如颜色、线型、粗细等等参考Word和其它软件里的实现方式,达到直观高效。
通过代码使用方便
对功能提供各种接口,如单一类的接口,复合类的接口。单一类的接口使某个局部操作实现容易,复合类的接口使成组功能一次完成。
功能的完整:
Y轴的显示比例动态可调,曲线区域全屏(第二版本实现),标志点实现(在TopX上点击确定,第二版本实现),曲线外观实现(包括锯齿类,波形类, 实底线类,带矩形柱类,第二版本实现),X轴和Y轴的区域放大和区域缩小实现及曲线对应部分的加亮实现(第二版本中实现),曲线锁定(第二版本实现),数据的文件输出和输入实现,打印实现(第二版本实现),非法数据的指示(第二版本实现),线型全,上右刻度指示,Grid显示,各种设置功能(如线型和字体)。
分析的完整:
涉及到的对象有:X轴:代表总长度,主刻度,子刻度,刻度字体;X轴名称,指示点位置:X轴名称图形;Y轴:代表总长度,主刻度,子刻度,刻度字体;Y轴名称:Y轴名称图形;TopX刻度:主刻度,刻度字体;RightY刻度:主刻度,刻度字体;原点:原点图形,原点名称,原点位置;标题:一般是曲线的名称;打印机:打印功能要逐步测试,不能到最后再考虑;Grid。这里只是初步的列举,详细的对象及类会在后面指明。
数据的完整性
不能以整型来组织数据,至少以float型,以后再考虑外部能不能确定使用何种类型来保存数据。
颜色搭配
背景色、各种轴的颜色、Grid的颜色、字体的颜色、标题的颜色、疧注的颜色和标志点的颜色都要讲究。
配置界面
具备时尚大方吸引人的特点,给人以美感。
线输出
给用户提供设置,在设置后可使绘图区域的曲线段具备一定的修饰能力,使曲线看起来流畅。
使用新技术,优化绘制算法。
CString fontName("宋体");
m_c1.StartAdd(2);//开始添加曲线个数
for(int i=0;i<2;i++) {//每个曲线项初始化循环
CString sNameBefore;
sNameBefore.Format("测试%d",i);//获取名称
//i%5作为线型i/5作为颜色
m_c1.SetNewItemOne(i,sNameBefore);//设置名称
m_c1.SetNewItemOneLineShort(i,0,(double)dbColor[i],2);//设置线形
m_c1.SetNewItemOneFont(i,(double)dbColor[i/5],0,fontName,8,0,0,0x00004000,1);//设置字体
}
m_c1.EndAdd();//添加结束
m_c1.SetXAxisName("时间");//设置X轴名称
m_c1.SetYAxisName("随机数");//设置Y轴名称
m_c1.SetNewXStep(2);//设置X轴刷新时间间隔
CString sName("M");
m_c1.SetYAdjustWay(3);//设置Y轴自动调整方法
m_c1.SetYScaleUnitAndName(1024*1024,sName);//设置Y轴长度
if(!m_c1.SetYTotalLenByShowItem()) {
double lTemp=10*1024*1024;
m_c1.SetYTotalLen64(lTemp);
}
m_c1.Invalidate();//刷新
在定时器代码里加上:
unsigned long lseed1=(unsigned)(time(NULL)%8333);//用时间获取第一个随机种子
unsigned long lseed2=(unsigned)(time(NULL)%3333);//用时间获取第二个随机种子
double *fData;
srand(lseed1);
fData=new double[2];//分配数据
fData[0]=rand();
srand(lseed2);
fData[1]=rand();
m_c1.AppendAllItemData(fData,2,true);//添加数据
BOOL CCurveCtrl::AppendAllItemData(double * pfData, short lDataCount,BOOL bInvalidate)
{
// TODO: Add your dispatch handler code here
int iItemCount=m_curveTotal.m_AryCurve.GetSize();
if(iItemCount!=lDataCount) {//判断曲线个数和数据个数是否一致
CString sTemp;
sTemp.Format(_T("一次向所有曲线单元添加数据时,曲线个数%d和数据个数%d不一致"),iItemCount,lDataCount);
MessageBox(sTemp);
return FALSE;
}
for(int i=0;i<iItemCount;i++) {
CCurveItem *pItem=NULL;
pItem=m_curveTotal.m_AryCurve.GetAt(i);//获取曲线项
if(!pItem) {
MessageBox(_T("一次向所有曲线单元添加数据时,遇到空指针"));
return FALSE;
}
pItem->AppendData(&pfData[i],1);//通过项指针添加数据
}
COleDateTime odtTemp;
odtTemp=COleDateTime::GetCurrentTime();
m_curveTotal.m_XAxis.SetEndTime(odtTemp);//刷新X轴
if(bInvalidate) Invalidate();//如果要求刷新,则刷新窗口
return TRUE;
}