桌面上的频谱分析仪






4.47/5 (20投票s)
2004年5月17日
3分钟阅读

117419

6210
用于绘制图表和图形的控件,特别是用于频谱分析仪的。
引言
最近我在一个项目中工作,我需要从无线电(或频谱分析仪)中提取数据。 我查看了 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();}
深入了解
使用双向链表来维护数据,控件确定应该绘制哪些数据点(考虑到滚动位置)并绘制它们。
控件定义了三个不同的比例:实际数据(点)、轴和视图。 您提供的任何数据都采用 ptRangeX
和 ptRangeY
提供的比例。 您放置在对话框上的控件的大小决定了轴比例。 但是,如图所示,用户可以为控件中的网格定义顶部、底部、左侧和右侧的边距。 这定义了视图比例。 因此,您添加到列表中的任何数据都应经过两个阶段才能绘制:从点到轴的转换(通过 MapPointToAxis()
函数),以及从轴到视图比例的转换(通过 MapAxisToView()
函数)。
此外,您可以通过在构造函数中更改这些变量来更改背景、网格、文本、绘图笔和高区域笔的颜色:m_crBackGround
、m_crGrids
、m_crText
、m_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日。