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坐标确定起始频率和终止频率,然后确定起始点和终止点的相对位置(即上段所说的三种情况),接下来重绘坐标系,针对三种不同情况分段绘制曲线,最后重绘军标线。