在开发实时数据可视化应用程序时,经常需要将仪器的实时数据以图形的形式展示出来。本文将介绍如何在Microsoft Visual Studio中使用图形控件来实现这一功能。将使用Microsoft eMbedded Visual C++ 3.0作为开发工具,并通过一个名为"MECGraphCtrl"的自定义图形控件来展示实时数据。
首先,需要在对话框中插入一个虚拟的图片控件,并将其大小调整为期望的图形控件大小。将这个控件命名为"IDC_GRAPH_CUSTOM",这个名字听起来很技术化。接下来,在自定义控件的属性中,需要为类名填写"GRAPH_CUSTOM"。这是需要在对话框类构造函数中注册的类名字符串。
在拥有者类(例如对话框)中,添加一个类型为MECGraphCtrl的成员变量。
class MECPerformerDlg : public CDialog {
// Construction...
protected:
static BOOL RegisterWndClass(HINSTANCE hInstance);
MECGraphCtrl m_oGraphCtrl;
};
在OnInitDialog函数中,需要注册自定义控件。
BOOL MECPerformerDlg::OnInitDialog() {
WNDCLASS wc;
wc.lpszClassName = _T("GRAPH_CUSTOM");
// matches class name
wc.hInstance = hInstance;
wc.lpfnWndProc = ::DefWindowProc;
// wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hIcon = 0;
wc.lpszMenuName = NULL;
wc.hbrBackground = (HBRUSH) ::GetStockObject(LTGRAY_BRUSH);
wc.style = CS_GLOBALCLASS;
// To be modified
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
return CDialog::OnInitDialog();
}
在OnInitDialog函数中,还需要创建控件。
BOOL MECPerformerDlg::OnInitDialog() {
CRect rect;
GetDlgItem(IDC_GRAPH_CUSTOM)->GetWindowRect(rect);
ScreenToClient(rect);
GetDlgItem(IDC_GRAPH_CUSTOM)->ShowWindow(SW_HIDE);
// create the control
m_oGraphCtrl.Create(WS_VISIBLE | WS_CHILD, rect, this);
return CDialog::OnInitDialog();
}
接下来,需要设置控件的垂直范围、背景颜色、网格颜色和绘图颜色。
BOOL MECPerformerDlg::OnInitDialog() {
// determine the rectangle for the control
CRect rect;
GetDlgItem(IDC_GRAPH_CUSTOM)->GetWindowRect(rect);
ScreenToClient(rect);
GetDlgItem(IDC_GRAPH_CUSTOM)->ShowWindow(SW_HIDE);
// create the control
m_oGraphCtrl.Create(WS_VISIBLE | WS_CHILD, rect, this);
m_oGraphCtrl.SetXRange(0, 10, 2);
m_oGraphCtrl.SetRange(0, 10, 2);
m_oGraphCtrl.SetYUnits("Volume in ml");
m_oGraphCtrl.SetXUnits("Time in seconds");
m_oGraphCtrl.SetBackgroundColor(RGB(0, 0, 64));
m_oGraphCtrl.SetGridColor(RGB(192, 192, 255));
m_oGraphCtrl.SetPlotColor(RGB(0, 255, 0));
return CDialog::OnInitDialog();
}
// Call the function with the data value to be appended to the plot.
m_oGraphCtrl.AppendPoint(nRandomX, nRandomY);