您的位置:首页 > 其它

EMC测试曲线选择缩放功能的实现

2008-05-10 13:12 211 查看
EMC测试曲线选择缩放功能的实现

EMC测试完成后,一般以曲线的形式显示在对数坐标系中。由于测试数据非常多,而对数坐标常常使得大量的数据分布不均,经常在一些地方使得测试曲线叠加在一起,看不清楚具体的数值和趋势。一幅CE102测试曲线如图1所示:



图1 CE102-全频段测试曲线图
由图可见,要想看清2MHz以后的数据只有两种方法:选择感兴趣的频段重新测试,或者将感兴趣的频段放大。重新测试需要耗费更多的时间,也是一种无谓的重复劳动,而且在某些情况下无法实现(没有频谱仪或接收机在身边的时候)。选择感兴趣的频段放大,既节省时间,又便于查看。
本程序中选择放大的使用方法极为简单,按下工具栏的放大按钮,在测试坐标系中按下并拖动鼠标左键选择频段,释放鼠标左键,这样就可以将选择的频段的测试曲线放大了。



图2 选择放大的方法
在图2中绿色虚线就是按下并拖动鼠标左键进行选择时的效果。
放大后的曲线如图3所示:



图3 选择放大后的测试曲线
放大后按下工具栏的缩小按钮就可以重新显示原始的测试数据。

下面介绍一下程序的编写。
选择频段的过程至少包含三个相关函数:void CEMCView::OnLButtonDown(UINT nFlags, CPoint point)、void CEMCView::OnLButtonUp(UINT nFlags, CPoint point)和void CEMCView::OnMouseMove(UINT nFlags, CPoint point)。三个函数的定义如下:


void CEMCView::OnLButtonDown(UINT nFlags, CPoint point)




...{


// TODO: 在此添加消息处理程序代码和/或调用默认值


m_lBtnDownPoint=point; // 记录按下鼠标左键的点


m_bIsLBtnDown=TRUE;




CScrollView::OnLButtonDown(nFlags, point);


}




void CEMCView::OnMouseMove(UINT nFlags, CPoint point)




...{


// TODO: 在此添加消息处理程序代码和/或调用默认值


if(m_bIsWorking && m_bIsLBtnDown && !m_bOldVersion)




...{


if(point.x>m_maxMouseX)


m_maxMouseX=point.x;


if(point.y>m_maxMouseY)


m_maxMouseY=point.y;




CRect rect(m_lBtnDownPoint.x-1,m_lBtnDownPoint.y-1,m_maxMouseX+1,m_maxMouseY+1);




CClientDC dc(this);


// Create a geometric pen.


LOGBRUSH logBrush;


logBrush.lbStyle = BS_SOLID;


logBrush.lbColor = RGB(17,255,17);//RGB(0,51,51);


CPen pen(PS_DOT|PS_GEOMETRIC|PS_ENDCAP_FLAT,2, &logBrush);


CPen* pOldPen=dc.SelectObject(&pen);




this->InvalidateRect(&rect);


this->UpdateWindow();




// 绘制虚线矩形


dc.MoveTo(m_lBtnDownPoint);


dc.LineTo(m_lBtnDownPoint.x,point.y);


dc.MoveTo(m_lBtnDownPoint.x,point.y);


dc.LineTo(point);


dc.MoveTo(point);


dc.LineTo(point.x,m_lBtnDownPoint.y);


dc.MoveTo(point.x,m_lBtnDownPoint.y);


dc.LineTo(m_lBtnDownPoint);




dc.SelectObject(pOldPen);


}


CScrollView::OnMouseMove(nFlags, point);


}




void CEMCView::OnLButtonUp(UINT nFlags, CPoint point)




...{


// TODO: 在此添加消息处理程序代码和/或调用默认值


m_bIsLBtnDown=FALSE;




m_zoomStartX=m_lBtnDownPoint.x;


m_zoomStopX=point.x;




// 更新视图


if(!m_bOldVersion)




...{


if(m_bIsZoomed)




...{


m_bDrawZoom=TRUE;


}


this->Invalidate();


this->UpdateWindow();


}




CScrollView::OnLButtonUp(nFlags, point);


}

由于测试是分成多段进行的,测试曲线的绘制也是分成多段来进行,因此选择放大时也要考虑到所选择区域是否包含关键点(频率段与频率段之间的边界点)。因此选择放大频段的显示也分为三种情况进行考虑:选择的起始点和终止点在同一分段内、在两相邻频段内、在不相邻的不同频段内。
由于选择放大显示的代码较多,只介绍编程思路吧。首先根据鼠标左键选择的起始点和终止点的X坐标确定起始频率和终止频率,然后确定起始点和终止点的相对位置(即上段所说的三种情况),接下来重绘坐标系,针对三种不同情况分段绘制曲线,最后重绘军标线。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: