⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 axisdlg.cpp

📁 Displaying large amounts of technical data in a chart can be a frustrating task. You can find tons o
💻 CPP
字号:
// AxisDlg.cpp: Implementierungsdatei
//

#include "stdafx.h"
#include "XGraph.h"
#include "AxisDlg.h"
#include "ChartPage.h"
#include "Float.h"
#include "math.h"

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

/////////////////////////////////////////////////////////////////////////////
// Dialogfeld CAxisDlg 

#pragma warning (disable : 4244)
#pragma warning (disable : 4800)

CAxisDlg::CAxisDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CAxisDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CAxisDlg)
	m_cName = _T("");
	m_bAutoScale = FALSE;
	m_fMin = 0.0;
	m_fMax = 0.0;
	m_bShowGrid = FALSE; 
	m_bTimeAxis = FALSE;
	m_bVisible = TRUE;
	m_nPrecision = 0;
	m_nArcSize = 0;
	m_nTickSize = 0;
	m_nMarkerSize = 0;
	m_fStep = 0.0;
	m_EndDate = 0.0;
	m_EndTime = 0.0;
	m_StartDate = 0.0;
	m_StartTime = 0.0;
	m_cDateTimeFormat = _T("");
	m_bShowMarker = FALSE;
	m_nPlacement = -1;
	m_nGridType = -1;
	m_nTimeStepType = -1;
	m_nTimeStep = 0;
	//}}AFX_DATA_INIT
}


void CAxisDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CAxisDlg)
	DDX_Control(pDX, IDC_SPINMARKERSIZE, m_SpinMarkerSize);
	DDX_Control(pDX, IDC_SPINARCSIZE, m_SpinArcSize);
	DDX_Control(pDX, IDC_SPINTICKSIZE, m_SpinTickSize);
	DDX_Control(pDX, IDC_GRIDCOLOR, m_GridColor);
	DDX_Control(pDX, IDC_COLOR, m_Color);
	DDX_Control(pDX, IDC_SPINPRECISION, m_SpinPrecision);
	DDX_Text(pDX, IDC_NAME, m_cName);
	DDX_Check(pDX, IDC_CBAUTOSCALE, m_bAutoScale);
	DDX_Text(pDX, IDC_MIN, m_fMin);
	DDV_MinMaxDouble(pDX, m_fMin, -DBL_MAX, DBL_MAX);
	DDX_Text(pDX, IDC_MAX, m_fMax);
	DDV_MinMaxDouble(pDX, m_fMax, -DBL_MAX, DBL_MAX);
	DDX_Check(pDX, IDC_CBGRID, m_bShowGrid);
	DDX_Check(pDX, IDC_CBVISIBLE, m_bVisible);
	DDX_Check(pDX, IDC_CBTIMEAXIS, m_bTimeAxis);
	DDX_Text(pDX, IDC_PRECISION, m_nPrecision);
	DDV_MinMaxUInt(pDX, m_nPrecision, 0, 6);
	DDX_Text(pDX, IDC_ARCSIZE, m_nArcSize);
	DDV_MinMaxUInt(pDX, m_nArcSize, 1, 10);
	DDX_Text(pDX, IDC_TICKSIZE, m_nTickSize);
	DDV_MinMaxUInt(pDX, m_nTickSize, 1, 10);
	DDX_Text(pDX, IDC_MARKERSIZE, m_nMarkerSize);
	DDV_MinMaxUInt(pDX, m_nMarkerSize, 1, 20);
	DDX_Text(pDX, IDC_STEP, m_fStep);
	DDX_DateTimeCtrl(pDX, IDC_ENDDATE, m_EndDate);
	DDX_DateTimeCtrl(pDX, IDC_ENDTIME, m_EndTime);
	DDX_DateTimeCtrl(pDX, IDC_STARTDATE, m_StartDate);
	DDX_DateTimeCtrl(pDX, IDC_STARTTIME, m_StartTime);
	DDX_Text(pDX, IDC_DATETIMEFORMAT, m_cDateTimeFormat);
	DDX_Check(pDX, IDC_CBSHOWMARKERS, m_bShowMarker);
	DDX_CBIndex(pDX, IDC_PLACEMENT, m_nPlacement);
	DDX_CBIndex(pDX, IDC_CBGRIDTYPE, m_nGridType);
	DDX_CBIndex(pDX, IDC_CBTIMESTEPTYPE, m_nTimeStepType);
	DDX_Text(pDX, IDC_TIMESTEP, m_nTimeStep);
	DDV_MinMaxUInt(pDX, m_nTimeStep, 1, 22118400); //365 days
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CAxisDlg, CDialog)
	//{{AFX_MSG_MAP(CAxisDlg)
	ON_BN_CLICKED(IDAPPLY, OnApply)
	ON_MESSAGE(CPN_SELCHANGE, OnColorChanged)
	ON_BN_CLICKED(IDC_BUTTON1, OnSelectFont)
	ON_BN_CLICKED(IDC_BUTTON2, OnTitleFont)
	ON_BN_CLICKED(IDC_CBAUTOSCALE, OnCbautoscale)
	ON_BN_CLICKED(IDC_CBTIMEAXIS, OnCbtimeaxis)
	ON_BN_CLICKED(IDC_CBGRID, OnChanged)
	ON_BN_CLICKED(IDC_CBVISIBLE, OnChanged)
	ON_WM_DRAWITEM()
	ON_WM_MEASUREITEM()
	ON_NOTIFY(DTN_DATETIMECHANGE, IDC_ENDDATE, OnDateTimeChanged)
	ON_NOTIFY(DTN_DATETIMECHANGE, IDC_ENDTIME, OnDateTimeChanged)
	ON_NOTIFY(DTN_DATETIMECHANGE, IDC_STARTDATE, OnDateTimeChanged)
	ON_NOTIFY(DTN_DATETIMECHANGE, IDC_STARTTIME, OnDateTimeChanged)
	ON_EN_CHANGE(IDC_ARCSIZE, OnChanged)
	ON_EN_CHANGE(IDC_DATETIMEFORMAT, OnChanged)
	ON_EN_CHANGE(IDC_MARKERSIZE, OnChanged)
	ON_EN_CHANGE(IDC_MAX, OnChanged)
	ON_EN_CHANGE(IDC_MIN, OnChanged)
	ON_EN_CHANGE(IDC_NAME, OnChanged)
	ON_EN_CHANGE(IDC_PRECISION, OnChanged)
	ON_EN_CHANGE(IDC_STEP, OnChanged)
	ON_EN_CHANGE(IDC_TICKSIZE, OnChanged)
	ON_BN_CLICKED(IDC_CBSHOWMARKERS, OnChanged)
	ON_CBN_SELCHANGE(IDC_PLACEMENT, OnChanged)
	ON_CBN_SELCHANGE(IDC_CBGRIDTYPE, OnChanged)
	ON_CBN_SELCHANGE(IDC_CBTIMESTEPTYPE, OnChanged)
	ON_EN_CHANGE(IDC_TIMESTEP, OnChanged)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// Behandlungsroutinen f黵 Nachrichten CAxisDlg 

void CAxisDlg::OnDateTimeChanged(NMHDR *,LRESULT *)
{
	OnChanged();
}

LRESULT CAxisDlg::OnColorChanged(WPARAM, LPARAM)
{
	GetDlgItem(IDAPPLY)->EnableWindow(TRUE);
	return 0;
}

void CAxisDlg::PresetValues()
{
	m_cName = m_pAxis->GetLabel();
	m_pAxis->GetRange(m_fMin, m_fMax, m_fStep);
	m_bAutoScale = m_pAxis->GetAutoScale();
	m_bTimeAxis = m_pAxis->GetDateTime();
	m_bShowGrid = m_pAxis->GetShowGrid();
	m_bVisible = m_pAxis->GetVisible ();
	m_Color.SetColor (m_pAxis->GetColor());
	m_GridColor.SetColor (m_pAxis->GetGridColor());
	m_bShowMarker = m_pAxis->GetShowMarker();
	m_nPlacement = (int) m_pAxis->GetPlacement();
		
	m_SpinPrecision.SetRange(0, 6);
	m_SpinArcSize.SetRange(1, 10);
	m_SpinTickSize.SetRange(1, 10);
	m_SpinMarkerSize.SetRange(1, 20);
	m_nArcSize  = m_pAxis->GetArcSize();
	m_nTickSize = m_pAxis->GetTickSize();
	m_nMarkerSize = m_pAxis->GetMarkerSize();
	m_SpinMarkerSize.SetPos(m_nMarkerSize);
	m_SpinArcSize.SetPos(m_nArcSize);
	m_SpinTickSize.SetPos(m_nArcSize);
	m_nGridType = m_pAxis->GetGridStyle();

	GetDlgItem(IDC_MIN)->EnableWindow(!m_bAutoScale && !m_bTimeAxis);
	GetDlgItem(IDC_MAX)->EnableWindow(!m_bAutoScale && !m_bTimeAxis);
	GetDlgItem(IDC_STEP)->EnableWindow(!m_bAutoScale && !m_bTimeAxis);
	GetDlgItem(IDC_STARTDATE)->EnableWindow(m_bTimeAxis && !m_bAutoScale);
	GetDlgItem(IDC_STARTTIME)->EnableWindow(m_bTimeAxis && !m_bAutoScale);
	GetDlgItem(IDC_ENDDATE)->EnableWindow(m_bTimeAxis && !m_bAutoScale);
	GetDlgItem(IDC_ENDTIME)->EnableWindow(m_bTimeAxis && !m_bAutoScale);
	GetDlgItem(IDC_TIMESTEP)->EnableWindow(m_bTimeAxis && !m_bAutoScale);
	GetDlgItem(IDC_CBTIMESTEPTYPE)->EnableWindow(m_bTimeAxis && !m_bAutoScale);
	GetDlgItem(IDC_PRECISION)->EnableWindow(!m_bTimeAxis);
	GetDlgItem(IDC_SPINPRECISION)->EnableWindow(!m_bTimeAxis);
	GetDlgItem(IDC_DATETIMEFORMAT)->EnableWindow(m_bTimeAxis);
	GetDlgItem(IDC_PLACEMENT)->EnableWindow(!m_bTimeAxis);

	m_nTimeStep = 1;
	
	if (!m_pAxis->GetDateTime())
	{
		m_StartDate = COleDateTime::GetCurrentTime();
		m_StartTime = COleDateTime::GetCurrentTime();
		m_EndDate   = COleDateTime::GetCurrentTime();
		m_EndTime   = COleDateTime::GetCurrentTime();
		
		int nPos = m_pAxis->GetDisplayFmt().Find (".",0);
		if (nPos >= 0)
		{
			CString cPrecision = m_pAxis->GetDisplayFmt().Mid (nPos+1);
			m_nPrecision = atoi(cPrecision);
			m_SpinPrecision.SetPos(m_nPrecision);
		}
	}
	else
	{

		m_cDateTimeFormat = m_pAxis->GetDisplayFmt();
		m_cDateTimeFormat.Replace ("\n", "\\n");
		m_nPrecision = 1;

		COleDateTimeSpan span(m_fStep);

		int nSeconds = span.GetTotalSeconds ();

		int nTimeStep;

		if (nSeconds > (24 * 60 * 60) &&!(nSeconds % (24 * 60 * 60)))
		{
			nTimeStep = nSeconds / (24 * 60 * 60);
			m_nTimeStepType = 3;
		}
		else
		if (nSeconds > (24 * 60) &&!(nSeconds % (24 * 60)))
		{
			nTimeStep = nSeconds / (24 * 60);
			m_nTimeStepType = 2;
		}
		else
		if (nSeconds > 60 &&!(nSeconds %  60))
		{
			nTimeStep = nSeconds / 60;
			m_nTimeStepType = 1;
		}
		else
		{
			nTimeStep = nSeconds;
			m_nTimeStepType = 0;
		}

		m_nTimeStep  = nTimeStep;
		m_StartDate  = m_fMin;
		m_StartTime  = m_fMin;
		m_EndDate    = m_fMax;
		m_EndTime    = m_fMax;
	}

	UpdateData(FALSE);
}

BOOL CAxisDlg::OnInitDialog() 
{
	CDialog::OnInitDialog();
	
	PresetValues();
			
	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX-Eigenschaftenseiten sollten FALSE zur點kgeben
}

void CAxisDlg::OnApply() 
{
	UpdateData(TRUE);

	m_pAxis->SetGridStyle(m_nGridType);
	m_pAxis->SetLabel(m_cName);
	m_pAxis->SetAutoScale(m_bAutoScale);
	m_pAxis->SetVisible(m_bVisible);

	
	if (!m_bAutoScale)
	{
		if (m_bTimeAxis)
		{
			int nType = 1;
			if (m_nTimeStepType == 1)
				nType = 60;
			if (m_nTimeStepType == 2)
				nType = 60 * 60;
			if (m_nTimeStepType == 3)
				nType = 60 * 60 * 24;

			COleDateTime dtStart, dtEnd;
			dtStart.SetDateTime(m_StartDate.GetYear (), m_StartDate.GetMonth (), m_StartDate.GetDay (),
				                m_StartTime.GetHour (), m_StartTime.GetMinute (), m_StartTime.GetSecond ());
			dtEnd.SetDateTime(m_EndDate.GetYear (), m_EndDate.GetMonth (), m_EndDate.GetDay (),
				                m_EndTime.GetHour (), m_EndTime.GetMinute (), m_EndTime.GetSecond ());

			m_fMin = dtStart;
			m_fMax = dtEnd;
			m_pAxis->SetCurrentRange (m_fMin, m_fMax, (double) COleDateTimeSpan(0,0,0,m_nTimeStep * nType));
		}
		else 
			m_pAxis->SetCurrentRange (m_fMin, m_fMax, m_fStep);
	}
	m_pAxis->SetShowGrid(m_bShowGrid);
	m_pAxis->SetPlacement((CXGraphAxis::EAxisPlacement) m_nPlacement);

	if (!m_bTimeAxis)
	{
		CString cTmp;
		
		double fCurMin, fCurMax, fCurStep;

		m_pAxis->GetRange(fCurMin, fCurMax, fCurStep);

		if (fabs(fCurMin) > 1E6 || fabs(fCurMax) > 1E6 ||
			(fabs(fCurMin) < 1E-6 && fabs(fCurMin) != 0.0) || (fabs(fCurMax) < 1E-6 && fabs(fCurMax) != 0.0))
			cTmp.Format("%%5.%de", m_nPrecision);
		else
			cTmp.Format("%%5.%df", m_nPrecision);

		m_pAxis->SetDisplayFmt(cTmp);
	}
	else
	{
		m_cDateTimeFormat.Replace ("\\n", "\n");
		m_pAxis->SetDisplayFmt(m_cDateTimeFormat);
	}

	m_pAxis->SetColor(m_Color.GetColor ());
	m_pAxis->SetGridColor(m_GridColor.GetColor ());
	m_pAxis->SetArcSize(m_nArcSize);
	m_pAxis->SetTickSize(m_nTickSize);
	m_pAxis->SetMarkerSize(m_nMarkerSize);
	m_pAxis->SetDateTime(m_bTimeAxis);
	m_pAxis->SetShowMarker( m_bShowMarker);
		
	m_pAxis->GetGraph()->Invalidate ();

	GetDlgItem(IDAPPLY)->EnableWindow(FALSE);
	
	
}

void CAxisDlg::OnSelectFont() 
{
	CFontDialog dlg;

	if (dlg.DoModal() == IDOK)
	{
		LOGFONT logFont;
		dlg.GetCurrentFont (&logFont);
		m_pAxis->SetFont (&logFont);
		OnChanged();
	}
	
}

void CAxisDlg::OnTitleFont() 
{
	CFontDialog dlg;

	if (dlg.DoModal() == IDOK)
	{
		LOGFONT logFont;
		dlg.GetCurrentFont (&logFont);
		m_pAxis->SetTitleFont (&logFont);
		OnChanged();
	}
	
}

void CAxisDlg::OnCbautoscale() 
{
	OnChanged();
}

void CAxisDlg::OnCbtimeaxis() 
{
	OnChanged();
}

void CAxisDlg::OnOK() 
{
	OnApply();	
	
	((CChartPage*)GetParentOwner ())->OnOK();
}

void CAxisDlg::OnChanged() 
{
	if (::IsWindow(m_hWnd) && IsWindowVisible())
	{
		UpdateData(TRUE);

		GetDlgItem(IDC_MIN)->EnableWindow(!m_bAutoScale && !m_bTimeAxis);
		GetDlgItem(IDC_MAX)->EnableWindow(!m_bAutoScale && !m_bTimeAxis);
		GetDlgItem(IDC_STEP)->EnableWindow(!m_bAutoScale && !m_bTimeAxis);
		GetDlgItem(IDC_STARTDATE)->EnableWindow(m_bTimeAxis && !m_bAutoScale);
		GetDlgItem(IDC_STARTTIME)->EnableWindow(m_bTimeAxis && !m_bAutoScale);
		GetDlgItem(IDC_ENDDATE)->EnableWindow(m_bTimeAxis && !m_bAutoScale);
		GetDlgItem(IDC_ENDTIME)->EnableWindow(m_bTimeAxis && !m_bAutoScale);
		GetDlgItem(IDC_PRECISION)->EnableWindow(!m_bTimeAxis);
		GetDlgItem(IDC_SPINPRECISION)->EnableWindow(!m_bTimeAxis);
		GetDlgItem(IDC_DATETIMEFORMAT)->EnableWindow(m_bTimeAxis);	
		GetDlgItem(IDAPPLY)->EnableWindow(TRUE);
		GetDlgItem(IDC_TIMESTEP)->EnableWindow(m_bTimeAxis && !m_bAutoScale);
		GetDlgItem(IDC_CBTIMESTEPTYPE)->EnableWindow(m_bTimeAxis && !m_bAutoScale);
		GetDlgItem(IDC_PLACEMENT)->EnableWindow(!m_bTimeAxis);
	
	}
}

void CAxisDlg::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct) 
{
	if (nIDCtl == IDC_CBGRIDTYPE)
	{
		if (lpDrawItemStruct->itemID < 0 || lpDrawItemStruct->itemID >= 5)
			return;

		CDCEx dc;

		dc.Attach (lpDrawItemStruct->hDC);
		
		int nSaveDC = ::SaveDC(lpDrawItemStruct->hDC);
		
		dc.FillSolidRect (&lpDrawItemStruct->rcItem, lpDrawItemStruct->itemState & ODS_SELECTED ? ::GetSysColor(COLOR_HIGHLIGHT) : ::GetSysColor(COLOR_WINDOW));
		
		{
			CPenSelector ps(0L, 1, &dc, lpDrawItemStruct->itemID);
			dc.MoveTo(lpDrawItemStruct->rcItem.left, lpDrawItemStruct->rcItem.top + 6);
			dc.LineTo(lpDrawItemStruct->rcItem.right, lpDrawItemStruct->rcItem.top + 6);
		}

		::RestoreDC (lpDrawItemStruct->hDC, nSaveDC);

		dc.Detach ();

	}
	else
		CDialog::OnDrawItem(nIDCtl, lpDrawItemStruct);
}

void CAxisDlg::OnMeasureItem(int nIDCtl, LPMEASUREITEMSTRUCT lpMeasureItemStruct) 
{
	if (nIDCtl == IDC_CBGRIDTYPE)
	{
		lpMeasureItemStruct->itemHeight = 16;
		lpMeasureItemStruct->itemWidth  = 16;
	}
	else
		CDialog::OnMeasureItem(nIDCtl, lpMeasureItemStruct);

}

#pragma warning (default : 4244)
#pragma warning (default : 4800)

void CAxisDlg::OnCancel() 
{
	((CChartPage*)GetParentOwner ())->OnCancel ();
}

BOOL CAxisDlg::PreTranslateMessage(MSG* pMsg) 
{
	if ((pMsg->message == WM_KEYDOWN || pMsg->message == WM_KEYUP) && (pMsg->wParam == VK_ESCAPE || pMsg->wParam == VK_RETURN))
		return TRUE;
	else
	return CDialog::PreTranslateMessage(pMsg);
		
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -