65.9K
CodeProject 正在变化。 阅读更多。
Home

示波器控件

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.71/5 (37投票s)

2004年6月22日

2分钟阅读

viewsIcon

188479

downloadIcon

10308

WTL 示波器控件。

Sample Image

引言

这是一个简单的示波器控件实现。该控件显示用户数据的最后 N 个点。它最多支持 8 个通道(通道数量由头文件中的 OSC_MAX_CHANNELS 参数定义)。每个通道只能显示一条曲线(在本版本中)。示波器包括通过 X(水平)、Y(垂直)以及同时通过两个轴(矩形)进行缩放的实现。通过在通道区域按下右键鼠标(按住 CTRL 键可完全缩放)也可以进行缩放。

使用代码

要在您的应用程序中使用此控件

  • 设计对话框并添加静态控件。
  • Oscilloscope.h 头文件添加到您的项目中。
  • OscilloscopeCtrl 控件分配给您的静态控件。
  • OnInitDialog() 中,使用 SubclassWindow 方法将 OscilloscopeCtrl 控件子类化到 ID。

不要忘记启用您需要的任何通道。

#include "Oscilloscope.h"


//...


class CMainDlg : public CDialogImpl<CMainDlg>
{     
    BEGIN_MSG_MAP(CMainDlg)          
       ...          
       MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog)          
       REFLECT_NOTIFICATIONS()     
    END_MSG_MAP()
    ...
    LRESULT OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, 
        LPARAM /*lParam*/, BOOL& /*bHandled*/);
    ...
    OscilloscopeCtrl m_oscill;     
    ...
}; 

//...


LRESULT CMainDlg::OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, 
      LPARAM /*lParam*/, BOOL& /*bHandled*/) 
{
     ...     
     m_oscill.SubclassWindow( ::GetDlgItem( IDC_AREA ) );     
     m_oscil.ShowChannel(0);
     m_oscil.ShowChannel(2);
     ...
}

创建示波器控件后,您可以为曲线和背景(每个通道)设置特殊颜色,设置点样式(如何绘制曲线的数据点),打开/关闭网格,设置填充和填充系数。填充是自动计算的值,用于通过 Y 轴偏移曲线。通过增加填充系数(k>1),可以减小曲线与通道顶部边界框之间的间隙。如果 k<1,则间隙将增加(当 k != 0 时)。您可以通过打开/关闭 X 和 Y 轴以及更改它们的位置(X 轴在顶部或底部;Y 轴在左侧或右侧)来更改示波器布局。重要提示:X 轴是所有通道的唯一一个,而 Y 轴是每个通道的唯一一个。

     ...
     m_oscil.UseGrid(true); // trun on grid

     m_oscil.UsePadding(true); // use padding

     m_oscil.PaddingCoef(2.0); // set padding coefficient

     m_oscil.PointStyle(UTriangle); // set point style to UTriangle

     m_oscil.GetChannel(0)->SetLnColor( RGB(0,255,0) ); // green curve

     m_oscil.GetChannel(0)->SetBgColor( RGB(0,0,0) ); // white background

     m_oscil.BottomXAxis(true); // adds bottom X axis

     m_oscil.LeftYAxis(true); // adds left Y axis

     ...

然后您需要为示波器提供数据(指向双精度数组的指针)。重要的是,您传递给示波器的双精度数组必须是全局的。为了提高绘图速度,示波器会将数据复制到其缓冲区中(!!!)。双精度数组仅包含 Y 值,示波器使用用户时间自动计算 X 值。

     ...
     // number of arrays have to be equal to OSC_MAX_CHANNELS !!!

     // but if you don't need data for example

     // for channel 1 the m_values[1] can be NULL

     double*  m_values[OSC_MAX_CHANNELS];
     size_t   m_cnt;
     size_t   m_time;
     ...
     m_oscil.SetPoints(m_time, m_values, m_cnt);
     ...

更新

  • 从头文件中删除了使用命名空间 std :)
  • 添加了双缓冲以避免绘制时的闪烁(感谢 Michal Mecinski)

      演示程序

      这个小演示程序展示了如何使用示波器控件。添加按钮来控制其布局,更改缩放模式,点样式,最后点数等。您可以更改源代码以供将来使用。

    • © . All rights reserved.