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

桌面上的频谱分析仪

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.47/5 (20投票s)

2004年5月17日

3分钟阅读

viewsIcon

117419

downloadIcon

6210

用于绘制图表和图形的控件,特别是用于频谱分析仪的。

Sample Image

引言

最近我在一个项目中工作,我需要从无线电(或频谱分析仪)中提取数据。 我查看了 CodeProject 中的所有图表控件,但似乎没有一个对我有用。 所以,我设法自己编写了它。 除了简单的图表绘制外,此控件还支持放大/缩小和滚动。 还可以用另一种颜色区分较高的数据,如图所示。

使用代码

首先,在您的对话框上放置一个 Picture 控件。 将其 ID 更改为 IDC_SPECTRUM_STATIC,并将其类型从 Frame 更改为 Rectangle。 更改控件的宽度和高度以使其适合。 该控件将在运行时创建。 将 #Include "SpectrumAnalyzer.h"; 添加到对话框的头文件。 为此控件向对话框添加一个成员变量

public:
    CSpectrumAnalyzer m_SpectrumAnalyzer_Ctrl;

现在,将这段代码放在您想要创建控件的任何地方

DWORD m_iStartFreq = 100000000, 
    m_iStopFreq = 150000000;  

CPoint ptRangeX(m_iStartFreq, m_iStopFreq),  // Freq. Range : 100-150 MHz 
    ptRangeY(0, 120);  // Signal Strength Range: 0-120 units

CRect rect; 
// Get the rectangular coordinates of the rectangle we already placed on dialog
GetDlgItem(IDC_SPECTRUM_STATIC)->GetWindowRect(rect);

// Convert to the client coordinates
ScreenToClient(rect);

// remember to destroy it if it was created before
if (m_SpectrumAnalyzer_Ctrl)
    m_SpectrumAnalyzer_Ctrl.Destroy();

// Create and place the spectrum control on screen
m_SpectrumAnalyzer_Ctrl.Create(rect, this, IDC_SPECTRUM_STATIC, ptRangeX, ptRangeY);

该控件只是通过上面的语句创建的。 ptRangeX 定义水平边界,ptRangeY 定义垂直边界。

特点

这些是公共成员函数及其描述

// Add a new point
void AddPoint(CPoint CurPos);

// Draw all viewable data
void DrawLine();

// Write(draw) some text on the control
void DrawText(CPoint Pos, CString szStr);

// Clear all the drawing in the control
void Clear();

// re-draw grids, re-write labels
void UpdateLabels();

// clear list of data 
void ClearList();

// return number of points in the control
int GetPointCount() { return m_pList->GetCount();}

深入了解

使用双向链表来维护数据,控件确定应该绘制哪些数据点(考虑到滚动位置)并绘制它们。

控件定义了三个不同的比例:实际数据(点)、轴和视图。 您提供的任何数据都采用 ptRangeXptRangeY 提供的比例。 您放置在对话框上的控件的大小决定了轴比例。 但是,如图所示,用户可以为控件中的网格定义顶部、底部、左侧和右侧的边距。 这定义了视图比例。 因此,您添加到列表中的任何数据都应经过两个阶段才能绘制:从点到轴的转换(通过 MapPointToAxis() 函数),以及从轴到视图比例的转换(通过 MapAxisToView() 函数)。

此外,您可以通过在构造函数中更改这些变量来更改背景、网格、文本、绘图笔和高区域笔的颜色:m_crBackGroundm_crGridsm_crTextm_crDrawPen m_crIndicatorPen

高级功能

因为这个控件主要是为用作接收器软件而编写的,所以它有一些额外的功能。 您可以使用 SetVHighIndicator() 函数突出显示高于阈值的数据。

当用户想要通过在按住 CTRL 键的同时单击鼠标左键将无线电设置为新频率时,控件还可以向父对话框发送回调消息。 当用户将鼠标移动到控件上时,将发送 WM_USER_SHOW_CURRENT_FREQ 消息。 您可能想使用此消息来显示指针处的频率。

使用这些函数将回调函数设置为这些消息

// Set the Callback message that control sends when
// user clicks the control to set to a frequency
m_SpectrumAnalyzer_Ctrl.SetCallbackSetToFreq(m_hWnd, WM_USER_SET_TO_FREQ); 

// Set the Callback message that control sends when user moves the mouse over control 
m_SpectrumAnalyzer_Ctrl.SetCallbackShowFreq(m_hWnd, WM_USER_SHOW_CURRENT_FREQ);

其中 m_hWnd 是接收消息的窗口的句柄。

如何改进?

可以修改绘图部分以提高速度。 我认为滚动部分是不明智的,因为它只是重新绘制窗口中的所有内容。 可以使用一些 API 函数来“移动”图像中未被滚动更改的部分。 此外,还需要一些用于垂直滚动的函数。 我没有在这里编写它。

历史

  • 第一个版本:2004年5月10日。
© . All rights reserved.