www.gusucode.com > VC++环境下从串口读取数据并实时绘制曲线图 > VC++环境下从串口读取数据并实时绘制曲线图/读取串口数据并画实时曲线的VC++程序源码/RTDlg.cpp

    // RTDlg.cpp : implementation file
//

#include "stdafx.h"
#include "RTDemo.h"
#include "RTDlg.h"
#include "ChildFrm.h"
#include "RTDemoDoc.h"
#include "RTDemoView.h"


#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CRTDlg dialog


CRTDlg::CRTDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CRTDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CRTDlg)
		// NOTE: the ClassWizard will add member initialization here
	//}}AFX_DATA_INIT
	m_pParent = pParent;
}


void CRTDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CRTDlg)
	DDX_Control(pDX, IDC_LDELETENAME, m_LDeleteName);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CRTDlg, CDialog)
	//{{AFX_MSG_MAP(CRTDlg)
	ON_BN_CLICKED(IDC_BDELETE, OnBdelete)
	ON_LBN_DBLCLK(IDC_LDELETENAME, OnDblclkLdeletename)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

void CRTDlg::ResetColorList()
{
	CChildFrame* pWnd  = (CChildFrame*)m_pParent;
	CRTDemoView*  pView = (CRTDemoView*)pWnd->m_wndSplitter.GetPane(0, 0);
	int n = pView->m_Graph.m_LineArray.GetSize();
	for(int i = 0; i < n; i ++)
		m_LDeleteName.AddString((LPCTSTR)i);
}

/////////////////////////////////////////////////////////////////////////////
// RTDlg message handlers

void CRTDlg::OnBdelete() 
{
	CChildFrame* pWnd  = (CChildFrame*)m_pParent;
	CRTDemoView*  pView = (CRTDemoView*)pWnd->m_wndSplitter.GetPane(0, 0);
	int n = pView->m_Graph.m_LineArray.GetSize();

	int m = m_LDeleteName.GetCurSel();
	if (m < 0 || m >= n)
		return;

	CString str;
	str.Format("Are you sure to delete <%s>", pView->m_Graph.m_LineArray[m].m_sName.GetChar());
	n = MessageBox(str, "Warning ...", MB_YESNO);
	if (n == IDNO)
		return;

	pView->RemoveALine(m);
	m_LDeleteName.ResetContent();
	ResetColorList();

	pView->RefreshGraph();
}

BOOL CRTDlg::OnInitDialog() 
{
	CDialog::OnInitDialog();
	
	ResetColorList();
	
	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}

void CRTDlg::OnDblclkLdeletename() 
{
	OnBdelete();
}
/////////////////////////////////////////////////////////////////////////////
// CModify dialog


CModify::CModify(CWnd* pParent /*=NULL*/)
	: CDialog(CModify::IDD, pParent)
{
	//{{AFX_DATA_INIT(CModify)
	m_EMDesc = _T("");
	m_EMMax = 0.0;
	m_EMMin = 0.0;
	m_EMScaleMin = 0.0;
	m_EMUnit = _T("");
	m_EMWidth = 0;
	m_EMScaleMax = 0.0;
	m_EMName = _T("");
	//}}AFX_DATA_INIT
	m_pParent = pParent;
}


void CModify::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CModify)
	DDX_Control(pDX, IDC_BAPPLY, m_BApply);
	DDX_Control(pDX, IDC_SMWIDTH, m_SMWidth);
	DDX_Control(pDX, IDC_CMSTYLE, m_CMStyle);
	DDX_Control(pDX, IDC_CMNAME, m_CMName);
	DDX_Control(pDX, IDC_BMCOLOR, m_BMColor);
	DDX_Text(pDX, IDC_EMDESC, m_EMDesc);
	DDV_MaxChars(pDX, m_EMDesc, 32);
	DDX_Text(pDX, IDC_EMMAX, m_EMMax);
	DDX_Text(pDX, IDC_EMMIN, m_EMMin);
	DDX_Text(pDX, IDC_EMSCALEMIN, m_EMScaleMin);
	DDV_MinMaxDouble(pDX, m_EMScaleMin, 0., 100.);
	DDX_Text(pDX, IDC_EMUNIT, m_EMUnit);
	DDV_MaxChars(pDX, m_EMUnit, 12);
	DDX_Text(pDX, IDC_EMWIDTH, m_EMWidth);
	DDV_MinMaxInt(pDX, m_EMWidth, 0, 5);
	DDX_Text(pDX, IDC_EMSCALEMAX, m_EMScaleMax);
	DDV_MinMaxDouble(pDX, m_EMScaleMax, 0., 100.);
	DDX_Text(pDX, IDC_EMNAME, m_EMName);
	DDV_MaxChars(pDX, m_EMName, 16);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CModify, CDialog)
	//{{AFX_MSG_MAP(CModify)
	ON_BN_CLICKED(IDC_BMCOLOR, OnBmcolor)
	ON_CBN_SELCHANGE(IDC_CMNAME, OnSelchangeCmname)
	ON_CBN_SELCHANGE(IDC_CMSTYLE, OnSelchangeCmstyle)
	ON_BN_CLICKED(IDC_BAPPLY, OnBapply)
	ON_EN_CHANGE(IDC_EMNAME, OnChangeEmname)
	ON_EN_CHANGE(IDC_EMDESC, OnChangeEmdesc)
	ON_EN_CHANGE(IDC_EMUNIT, OnChangeEmunit)
	ON_EN_CHANGE(IDC_EMWIDTH, OnChangeEmwidth)
	ON_EN_CHANGE(IDC_EMMIN, OnChangeEmmin)
	ON_EN_CHANGE(IDC_EMMAX, OnChangeEmmax)
	ON_EN_CHANGE(IDC_EMSCALEMIN, OnChangeEmscalemin)
	ON_EN_CHANGE(IDC_EMSCALEMAX, OnChangeEmscalemax)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CModify message handlers

void CModify::OnBmcolor() 
{
	CColorDialog crDlg;
	
	if (crDlg.DoModal() == IDOK)
	{
		m_nColor = crDlg.GetColor();
		m_BMColor.SetColor(m_nColor);
		m_BApply.EnableWindow();
	}
}

void CModify::SaveLine(int i)
{
	CChildFrame* pWnd  = (CChildFrame*)m_pParent;
	CRTDemoView*  pView = (CRTDemoView*)pWnd->m_wndSplitter.GetPane(0, 0);

	UpdateData();
	pView->m_Graph.m_LineArray[i].m_dMin	 	 = m_EMMin;
	pView->m_Graph.m_LineArray[i].m_dMax		 = m_EMMax;
	pView->m_Graph.m_LineArray[i].m_dScaleLow    = m_EMScaleMin;
	pView->m_Graph.m_LineArray[i].m_dScaleHigh   = m_EMScaleMax;
	pView->m_Graph.m_LineArray[i].m_sDescription = (const char*)m_EMDesc;
	pView->m_Graph.m_LineArray[i].m_sUnit		 = (const char*)m_EMUnit;
	pView->m_Graph.m_LineArray[i].m_sName		 = (const char*)m_EMName;
	pView->m_Graph.m_LineArray[i].m_nColor		 = m_nColor;
	pView->m_Graph.m_LineArray[i].m_nLineWidth   = m_SMWidth.GetPos();
	pView->m_Graph.m_LineArray[i].m_nLineStyle   = m_CMStyle.GetCurSel();
	UpdateData(FALSE);

	pView->SaveAModifiedLine();
}

void CModify::OnSelchangeCmname() 
{
	CChildFrame* pWnd  = (CChildFrame*)m_pParent;
	CRTDemoView*  pView = (CRTDemoView*)pWnd->m_wndSplitter.GetPane(0, 0);
	int n = pView->m_Graph.m_LineArray.GetSize();

	int m = m_CMName.GetCurSel();
	if (m < 0 || m >= n)
		return;

	if (m_BApply.IsWindowEnabled())
	{
		n = MessageBox("Save changes for <" + (CString)pView->m_Graph.m_LineArray[m_nIndex].m_sName.GetChar() + "> ?", 
						AfxGetAppName(), MB_YESNO);
		if (n == IDYES)
		{
			SaveLine(m_nIndex);
		}
	}

	Reset(m);	
}

void CModify::OnSelchangeCmstyle() 
{
	int m = m_CMStyle.GetCurSel();
	if (m < 0 || m > 2)
		return;

	if (m > 0)
		m_SMWidth.SetPos(0);
	UpdateData();
	UpdateData(FALSE);
	m_BApply.EnableWindow();
}

void CModify::Reset(int i)
{
	CChildFrame* pWnd  = (CChildFrame*)m_pParent;
	CRTDemoView*  pView = (CRTDemoView*)pWnd->m_wndSplitter.GetPane(0, 0);

	m_nIndex	 = i;
	m_EMMin		 = pView->m_Graph.m_LineArray[i].m_dMin;
	m_EMMax		 = pView->m_Graph.m_LineArray[i].m_dMax;
	m_EMScaleMin = pView->m_Graph.m_LineArray[i].m_dScaleLow;
	m_EMScaleMax = pView->m_Graph.m_LineArray[i].m_dScaleHigh;
	m_EMName	 = pView->m_Graph.m_LineArray[i].m_sName.GetChar();
	m_EMDesc	 = pView->m_Graph.m_LineArray[i].m_sDescription.GetChar();
	m_EMUnit	 = pView->m_Graph.m_LineArray[i].m_sUnit.GetChar();
	m_CMName.SetCurSel(i);
	m_CMStyle.SetCurSel(pView->m_Graph.m_LineArray[i].m_nLineStyle);
	UpdateData(FALSE);
	m_SMWidth.SetPos(pView->m_Graph.m_LineArray[i].m_nLineWidth);
	m_nColor = pView->m_Graph.m_LineArray[i].m_nColor;
	m_BMColor.SetColor(m_nColor);
	m_BApply.EnableWindow(FALSE);
}

BOOL CModify::OnInitDialog() 
{
	CDialog::OnInitDialog();
	
	CChildFrame* pWnd  = (CChildFrame*)m_pParent;
	CRTDemoView*  pView = (CRTDemoView*)pWnd->m_wndSplitter.GetPane(0, 0);
	int n = pView->m_Graph.m_LineArray.GetSize();
	if (n == 0)
		return FALSE;

	for(int i = 0; i < n; i ++)
		m_CMName.AddString(pView->m_Graph.m_LineArray[i].m_sName.GetChar());

	m_SMWidth.SetRange(0, 5);
	Reset(0);

	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}

void CModify::OnBapply() 
{
	SaveLine(m_nIndex);
	m_BApply.EnableWindow(FALSE);
}

void CModify::OnChangeEmname() 
{
	UpdateData();
	m_CMName.InsertString(m_nIndex, (LPCTSTR)m_EMName);
	m_CMName.DeleteString(m_nIndex + 1);
	m_CMName.SetCurSel(m_nIndex);
	UpdateData(FALSE);
	m_BApply.EnableWindow();
}

void CModify::OnChangeEmdesc() 
{
	m_BApply.EnableWindow();
}

void CModify::OnChangeEmunit() 
{
	m_BApply.EnableWindow();
}

void CModify::OnChangeEmwidth() 
{
	if (::IsWindow(m_BApply.m_hWnd))
	{
		m_BApply.EnableWindow();

		UpdateData();
		if (m_SMWidth.GetPos() > 1)
			m_CMStyle.SetCurSel(0);
		UpdateData(FALSE);
	}
}

void CModify::OnChangeEmmin() 
{
	m_BApply.EnableWindow();
}

void CModify::OnChangeEmmax() 
{
	m_BApply.EnableWindow();
}

void CModify::OnChangeEmscalemin() 
{
	m_BApply.EnableWindow();
}

void CModify::OnChangeEmscalemax() 
{
	m_BApply.EnableWindow();
}

void CModify::OnCancel() 
{
	CChildFrame* pWnd  = (CChildFrame*)m_pParent;
	CRTDemoView*  pView = (CRTDemoView*)pWnd->m_wndSplitter.GetPane(0, 0);
	if (m_BApply.IsWindowEnabled())
	{
		int n = MessageBox("Save changes for <" + (CString)pView->m_Graph.m_LineArray[m_nIndex].m_sName.GetChar() + "> ?", 
						AfxGetAppName(), MB_YESNO);
		if (n == IDYES)
		{
			SaveLine(m_nIndex);
		}
	}
	
	CDialog::OnCancel();
}
/////////////////////////////////////////////////////////////////////////////
// CInsert dialog


CInsert::CInsert(CWnd* pParent /*=NULL*/)
	: CDialog(CInsert::IDD, pParent)
{
	//{{AFX_DATA_INIT(CInsert)
	m_EIDesc = _T("");
	m_EIIndex = 0;
	m_EIMax = 0.0;
	m_EIMin = 0.0;
	m_EIName = _T("");
	m_EIScaledMax = 0.0;
	m_EIScaledMin = 0.0;
	m_EIUnit = _T("");
	m_EIWidth = 0;
	//}}AFX_DATA_INIT
	m_pParent = pParent;
}


void CInsert::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CInsert)
	DDX_Control(pDX, IDC_BIAPPLY, m_BIApply);
	DDX_Control(pDX, IDC_SIWIDTH, m_SIWidth);
	DDX_Control(pDX, IDC_SIINDEX, m_SIIndex);
	DDX_Control(pDX, IDC_CISTYLE, m_CIStyle);
	DDX_Control(pDX, IDC_BICOLOR, m_BIColor);
	DDX_Text(pDX, IDC_EIDESCRIPTION, m_EIDesc);
	DDV_MaxChars(pDX, m_EIDesc, 32);
	DDX_Text(pDX, IDC_EIINDEX, m_EIIndex);
	DDV_MinMaxInt(pDX, m_EIIndex, 0, 20);
	DDX_Text(pDX, IDC_EIMAX, m_EIMax);
	DDX_Text(pDX, IDC_EIMIN, m_EIMin);
	DDX_Text(pDX, IDC_EIName, m_EIName);
	DDV_MaxChars(pDX, m_EIName, 16);
	DDX_Text(pDX, IDC_EISCALEDMAX, m_EIScaledMax);
	DDV_MinMaxDouble(pDX, m_EIScaledMax, 0., 100.);
	DDX_Text(pDX, IDC_EISCALEDMIN, m_EIScaledMin);
	DDV_MinMaxDouble(pDX, m_EIScaledMin, 0., 100.);
	DDX_Text(pDX, IDC_EIUNIT, m_EIUnit);
	DDV_MaxChars(pDX, m_EIUnit, 8);
	DDX_Text(pDX, IDC_EIWIDTH, m_EIWidth);
	DDV_MinMaxInt(pDX, m_EIWidth, 0, 5);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CInsert, CDialog)
	//{{AFX_MSG_MAP(CInsert)
	ON_BN_CLICKED(IDC_BICOLOR, OnBicolor)
	ON_CBN_SELCHANGE(IDC_CISTYLE, OnSelchangeCistyle)
	ON_BN_CLICKED(IDC_BIAPPLY, OnBiapply)
	ON_EN_CHANGE(IDC_EIWIDTH, OnChangeEiwidth)
	ON_EN_CHANGE(IDC_EIUNIT, OnChangeEiunit)
	ON_EN_CHANGE(IDC_EISCALEDMIN, OnChangeEiscaledmin)
	ON_EN_CHANGE(IDC_EISCALEDMAX, OnChangeEiscaledmax)
	ON_EN_CHANGE(IDC_EIName, OnChangeEIName)
	ON_EN_CHANGE(IDC_EIMIN, OnChangeEimin)
	ON_EN_CHANGE(IDC_EIMAX, OnChangeEimax)
	ON_EN_CHANGE(IDC_EIINDEX, OnChangeEiindex)
	ON_EN_CHANGE(IDC_EIDESCRIPTION, OnChangeEidescription)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CInsert message handlers

void CInsert::OnBicolor() 
{
	CColorDialog crDlg;
	
	if (crDlg.DoModal() == IDOK)
	{
		m_nColor = crDlg.GetColor();
		m_BIColor.SetColor(m_nColor);
	}
}

void CInsert::OnSelchangeCistyle() 
{
	int m = m_CIStyle.GetCurSel();
	if (m < 0 || m > 2)
		return;

	if (m > 0)
		m_SIWidth.SetPos(0);
	UpdateData();
	UpdateData(FALSE);
	m_BIApply.EnableWindow();
}

BOOL CInsert::OnInitDialog() 
{
	CDialog::OnInitDialog();
	
	CChildFrame* pWnd  = (CChildFrame*)m_pParent;
	CRTDemoView*  pView = (CRTDemoView*)pWnd->m_wndSplitter.GetPane(0, 0);
	int n = pView->m_Graph.m_LineArray.GetSize();

	m_CIStyle.SetCurSel(0);
	m_SIIndex.SetRange(1, n + 1);
	m_SIWidth.SetRange(0, 5);
	m_SIIndex.SetPos(n + 1);
	m_SIWidth.SetPos(0);
	m_BIApply.EnableWindow(FALSE);

	m_EIName	  = "Type name here";
	m_EIDesc	  = "Type description here";
	m_EIUnit	  = "N/A";
	m_EIMin		  = 0;
	m_EIMax		  = 100;
	m_EIScaledMin = 0;
	m_EIScaledMax = 100;

	UpdateData(FALSE);
	
	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}

void CInsert::OnBiapply() 
{
	InsertALine();
}

void CInsert::InsertALine()
{
	CChildFrame* pWnd  = (CChildFrame*)m_pParent;
	CRTDemoView*  pView = (CRTDemoView*)pWnd->m_wndSplitter.GetPane(0, 0);

	UpdateData();
	int i = m_SIIndex.GetPos() - 1;

	if (pView->InsertALine(i, m_BIColor.GetColor(), m_EIScaledMin, m_EIScaledMax, 
						  (const char*)m_EIName, (const char*)m_EIDesc, (const char*)m_EIUnit, 
					       m_EIMin, m_EIMax, m_CIStyle.GetCurSel(), m_SIWidth.GetPos()))
	{
		int lower, upper;
		m_SIIndex.GetRange(lower, upper);
		m_SIIndex.SetRange(lower, upper + 1); 
		UpdateData(FALSE);
		m_BIApply.EnableWindow(FALSE);
		pView->RefreshGraph();
	}
	else
		MessageBox("Insert a line failed !!!");
}

void CInsert::OnCancel() 
{
	CChildFrame* pWnd  = (CChildFrame*)m_pParent;
	CRTDemoView*  pView = (CRTDemoView*)pWnd->m_wndSplitter.GetPane(0, 0);
	if (m_BIApply.IsWindowEnabled())
	{
		UpdateData();
		int n = MessageBox("Save changes for <" + m_EIName + "> ?", 
						AfxGetAppName(), MB_YESNO);
		if (n == IDYES)
		{
			InsertALine();
		}
	}
	
	CDialog::OnCancel();
}

void CInsert::OnChangeEiwidth() 
{
	if (::IsWindow(m_BIApply.m_hWnd))
	{
		m_BIApply.EnableWindow();

		UpdateData();
		if (m_SIWidth.GetPos() > 1)
			m_CIStyle.SetCurSel(0);
		UpdateData(FALSE);
	}
}

void CInsert::OnChangeEiunit() 
{
	m_BIApply.EnableWindow();
}

void CInsert::OnChangeEiscaledmin() 
{
	m_BIApply.EnableWindow();
}

void CInsert::OnChangeEiscaledmax() 
{
	m_BIApply.EnableWindow();
}

void CInsert::OnChangeEIName() 
{
	m_BIApply.EnableWindow();
}

void CInsert::OnChangeEimin() 
{
	m_BIApply.EnableWindow();
}

void CInsert::OnChangeEimax() 
{
	m_BIApply.EnableWindow();
}

void CInsert::OnChangeEiindex() 
{
	if (::IsWindow(m_BIApply.m_hWnd))
		m_BIApply.EnableWindow();
}

void CInsert::OnChangeEidescription() 
{
	m_BIApply.EnableWindow();
}