AdvPlot 函数用于在指定的设备上下文中绘制一个高级图形。
首先要在项目中添加对应的AdvPlot头文件以及源文件,然后
AdvPlot m_Plot;//创建对象
m_Plot.SubclassDlgItem(IDC_PLOT,this);//在初始化对话框中将画波形的对象与界面上的CustomCtrl控件名连接起来
m_Plot.SetGrid(GRID,RGB(64,96,64),PS_SOLID);//设置网格
m_Plot.SetbgColor(RGB(0,0,0));//设置背景黑色
m_Plot.SetTopTitle(_T("波形"));
m_Plot.SetYLeftDanwei(_T("100mV/格"));//设置Y左侧轴的单位显示标签
m_Plot.SetYRightDanwei(_T("100mV/格"));
m_Plot.SetYAxisDanweiFontHeight(20);//设置Y轴字体最大为20
m_Plot.SetTimeTitleFontHeight(20);
m_Plot.SetYLeftRange(-5000,5000,false);//设置Y轴左侧范围,布尔变量为true时表示重绘更新
m_Plot.SetYRightRange(-5000,5000,false);//设置Y轴右侧范围
m_Plot.SetTimeAxisRange(0,100000000,false,false);//设置时间轴范围,100ms
CRoundSliderCtrl是一个自定义的圆形滑块控件,继承自CSliderCtrl,相当于一个可拖动值使波形改变位置的滑块。
新的类对象名为CVlgRoundSliderCtrl:
CVlgRoundSliderCtrl m_Slider_LeftY;
CVlgRoundSliderCtrl m_Slider_RightY;
long long int Val = m_Slider_LeftY.GetRealValue();//获取滑块的值
m_Plot.SetYLeftRange(-Val*5,Val*5,TRUE);//设置Y轴范围
LeftDisplayZoomCtrl();//自定义的左轴放大控制函数Val = m_Slider_RightY.GetRealValue();//获取滑块的值
m_Plot.SetYRightRange(-Val*5,Val*5,TRUE);//设置Y轴范围
RightDisplayZoomCtrl();//自定义的右轴放大控制函数//从设备读取电压数据并画线
int m_CapLen = 0;
double *Buff = new double[Len];//Len为消息触发采集时捕获的数据长度Len = Capture(m_CapLen,0);
Len *= 1024;//转换成长度
unsigned int BufLen = ReadVoltageDatas(Ch/*通道数*/,Buff,Len);//从设备读取电压数据,函数在VdsoLib头文件中,所以要先包含头文件和源文件,不同文件对应函数名可能不同
int OutRange = IsVoltageDatasOutRange(Ch);//判断电压数据是否超出设备测量范围,0表示未超出
bool AddLine =false;//判断是否需要在绘制波形时添加线条
if(!m_Plot.HaveLine("通道1"))
{AddLine = true;//如果此通道对应的波形无线条则需添加线条
}
else if(m_Plot.GetBufferLength("通道1")!= BufLen)
{m_Plot.DestoryLine("通道1");AddLine=true;//如果获取波形数据长度不等于读取到的数据长度,则删除已有线条
}
if(AddLine)
{lineattribute line;line.pctName = "通道1";line.clr = RGB(255,0,0);line.lr_lengend = -1;line.buf = NULL;line.length = Len;m_Plot.CreateLine(&line);
}
double TimeLen = BufLen*1000000000.0/m_sample;//将采集点换算为时间ns
m_Plot.ChangeDatas("通道1",Buff,BufLen,0,TimeLen);//将数据copy到线条数据中
m_Plot.ReDraw();//重绘
NextCapture();//进行下一次的捕获设备数据
ON_MESSAGE 是 MFC(Microsoft Foundation Classes)框架中的一个宏,用于处理自定义消息。在 MFC 中,消息通常通过消息映射(Message Map)机制进行处理,而 ON_MESSAGE 宏就是用于将自定义消息映射到相应的处理函数上。
ON_MESSAGE 宏的使用方法:
定义自定义消息:首先,你需要定义一个自定义消息。通常,自定义消息的定义是通过在应用程序的头文件中添加一个常量来实现的,这个常量的值应该大于 WM_USER(0x0400),以避免与系统定义的消息冲突。
#define WM_MY_CUSTOM_MESSAGE (WM_USER + 1)
在类的头文件中声明消息处理函数:接下来,你需要在类的头文件中声明一个消息处理函数。这个函数应该返回 LRESULT 类型,并接受两个参数:WPARAM 和 LPARAM,这两个参数用于传递消息的附加信息。
class CMyClass : public CWinApp
{
protected:afx_msg LRESULT OnMyCustomMessage(WPARAM wParam, LPARAM lParam);
};
在类的实现文件中添加消息映射:然后,在类的实现文件中,使用 BEGIN_MESSAGE_MAP 和 END_MESSAGE_MAP 宏来定义消息映射。在这个映射中,你需要使用 ON_MESSAGE 宏将自定义消息映射到之前声明的处理函数上。
BEGIN_MESSAGE_MAP(CMyClass, CWinApp)ON_MESSAGE(WM_MY_CUSTOM_MESSAGE, OnMyCustomMessage)
END_MESSAGE_MAP()
实现消息处理函数:最后,你需要在类的实现文件中实现消息处理函数。这个函数将在接收到自定义消息时被调用。
LRESULT CMyClass::OnMyCustomMessage(WPARAM wParam, LPARAM lParam)
{// 处理自定义消息的代码return 0;
}