📄 chart.h
字号:
if (nY < m_MinValue)
{
m_MinValue = nY;
SendNewLimits();
}
} //else fisrt point
//
uID = nID;
uX = nX;
//
/////////////////////////////////////////
m_mapLines[nID].m_Time[nX] = GetCurrentTime();
/////////////////////////////////////////
m_mapLines[nID].m_mapData[nX] = nY;
if (ErasePoints()) bScrollModi = TRUE;
if (bScrollModi) Normalize();
if (bDraw) Invalidate();//导致OnPaint()的调用
if (bScrollModi) UpdateScrollInfo();
return TRUE;
}
template<class T>
BOOL CScrollChart<T>::AddLine(UINT nID, COLORREF crColor, DWORD nStyle, int nWidth, BOOL bVisible, int nAutoInc)
{
if (!(m_setLinesID.insert(nID).second)) return FALSE;
if (!((0x0000FFFF) & nStyle)) nStyle |= PS_SOLID;
stuctLine structLineTmp;
structLineTmp.bIsAuto = ((LS_HORZAUTO & nStyle)? TRUE : FALSE);
structLineTmp.bPoints = ((LS_POINT & nStyle)? TRUE : FALSE);
structLineTmp.nAutoHorzInc = nAutoInc;
structLineTmp.crColor = crColor;
structLineTmp.nStyle = ((0x0000FFFF) & nStyle);
structLineTmp.nWidth = nWidth;
structLineTmp.bIsVisible = bVisible;
m_mapLines[nID] = structLineTmp;
//统计子集数目
m_nSet++;
//////////////
return TRUE;
}
template<class T>
BOOL CScrollChart<T>::Create(DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID)
{
dwStyle |= WS_CHILD;
dwStyle |= WS_HSCROLL;
if (dwStyle & GS_NOTIFY) m_bNorify=TRUE; else m_bNorify=FALSE;
dwStyle &= ~(GS_NOTIFY);
BOOL nresult = CWnd::Create(NULL, NULL,dwStyle, rect, pParentWnd, nID, NULL);
m_ColorBk = RGB(0,0,0);
m_bGrid = TRUE;
m_MinValue = 0;
//m_MaxValue = m_nHzRange;
m_MaxHzVal = m_nHzRange;
m_MaxValue = 0;
m_nHorzDiv = 20;
m_nVertDiv = 12;
UpdateScrollInfo();
return nresult;
}
template<class T>
void CScrollChart<T>::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar )
{
float nIntPos;
CString tmp;
switch (nSBCode) {
case SB_LINELEFT:
if (m_pointIni < 1) return;
m_pointIni -= (m_nHzRange * .01);//点击滚动条左边按钮的操作
break;
case SB_LINERIGHT:
m_pointIni += (m_nHzRange * .01);//点击滚动条右边按钮的操作
break;
case SB_PAGEUP:
m_pointIni -= m_nHzRange / 2;//点击滚动条滑块左边的操作
if ( m_pointIni < 0 ) m_pointIni = 0;
break;
case SB_PAGERIGHT:
m_pointIni += m_nHzRange / 2;//点击滚动条滑块右边的操作
break;
case SB_THUMBTRACK:
nIntPos=( (int)nPos / (SCROLL_VALUE) );//点击滑块本身的操作
m_pointIni = ( (m_MaxHzVal - m_MinHzVal ) * nIntPos) + m_MinHzVal;
break;
default:
return;
}
if ((m_pointIni > m_MaxHzVal - m_nHzRange)) m_pointIni = m_MaxHzVal - m_nHzRange;
if ( m_pointIni < m_MinHzVal ) m_pointIni = m_MinHzVal;
//////
//m_mapLines[uID].m_Time[uX] = GetCurrentTime();
//////
Invalidate();//重绘
UpdateScrollInfo();
}
template<class T>
COLORREF CScrollChart<T>::SetBkColor(COLORREF cr )
{
COLORREF crOld = m_ColorBk;
m_ColorBk = cr;
Invalidate();
return crOld;
}
template<class T>
COLORREF CScrollChart<T>::GetBkColor() const
{
return m_ColorBk;
}
template<class T>
COLORREF CScrollChart<T>::SetLineColor(UINT nID, COLORREF cr )
{
COLORREF crOld;
if (m_setLinesID.find(nID) == m_setLinesID.end()) return NULL;
crOld = m_mapLines[nID].crColor;
m_mapLines[nID].crColor = cr;
Invalidate();
return crOld;
}
template<class T>
COLORREF CScrollChart<T>::GetLineColor(UINT nID)
{
if (m_setLinesID.find(nID) == m_setLinesID.end()) return NULL;
return m_mapLines[nID].crColor;
}
template<class T>
int CScrollChart<T>::SetLineStyle(UINT nID, int nStyle,BOOL bDraw)
{
if (m_setLinesID.find(nID) == m_setLinesID.end()) return 0;
int nResult = m_mapLines[nID].nStyle;
m_mapLines[nID].nStyle = nStyle;
if (bDraw) Invalidate();
return nResult;
}
template<class T>
int CScrollChart<T>::GetLineStyle(UINT nID)
{
if (m_setLinesID.find(nID) == m_setLinesID.end()) return 0;
return m_mapLines[nID].nStyle;
}
template<class T>
int CScrollChart<T>::SetLineWidth(UINT nID, int nWidth,BOOL bDraw)
{
if (m_setLinesID.find(nID) == m_setLinesID.end()) return 0;
int nResult = m_mapLines[nID].nWidth;
m_mapLines[nID].nWidth = nWidth;
if (bDraw) Invalidate();
return nResult;
}
template<class T>
int CScrollChart<T>::GetLineWidth(UINT nID)
{
if (m_setLinesID.find(nID) == m_setLinesID.end()) return 0;
return m_mapLines[nID].nWidth;
}
template<class T>
T CScrollChart<T>::SetAutoinc(UINT nID,T nInc)//设置点间距
{
if (m_setLinesID.find(nID) == m_setLinesID.end()) return 0;
T nTmp = m_mapLines[nID].nAutoHorzInc;
m_mapLines[nID].nAutoHorzInc = nInc;
return nTmp;
}
template<class T>
void CScrollChart<T>::ShowLine(UINT nID, BOOL value, BOOL bDraw)
{
if (m_setLinesID.find(nID) == m_setLinesID.end()) return;
m_mapLines[nID].bIsVisible = value;
if (bDraw) Invalidate();
}
template<class T>
void CScrollChart<T>::ShowPoints(UINT nID, BOOL value, BOOL bDraw)
{
if (m_setLinesID.find(nID) == m_setLinesID.end()) return;
m_mapLines[nID].bPoints = value;
if (bDraw) Invalidate();
}
template<class T>
UINT CScrollChart<T>::SetMaxPoints(UINT nValue)
{
UINT nTemp = m_nMaxPoints;
m_nMaxPoints = nValue;
if (nTemp != nValue)
{
ErasePoints();
Invalidate();
}
return nTemp;
}
template<class T>
void CScrollChart<T>::SetGrid(BOOL value)
{
m_bGrid = value;
Invalidate();
}
template<class T>
UINT CScrollChart<T>::SetHorzDiv(UINT nDiv, BOOL bDraw)
{
UINT nTmp = m_nHorzDiv;
m_nHorzDiv = nDiv;
if (bDraw) Invalidate();
return nTmp;
}
template<class T>
UINT CScrollChart<T>::SetVertDiv(UINT nDiv, BOOL bDraw)
{
UINT nTmp = m_nVertDiv;
m_nVertDiv = nDiv;
if (bDraw) Invalidate();
return nTmp;
}
template<class T>
CPoint CScrollChart<T>::LPtoDP(T X,T Y)
{
int nY;
int nX;
CRect rectClient;
GetClientRect(rectClient);
nY = ((rectClient.Height() * Y * .95) / m_MaxValue);
nX = ((rectClient.Width() * (X - m_pointIni)) / m_nHzRange);
return CPoint(nX, rectClient.Height() - nY);
}
template<class T>
T CScrollChart<T>::SetHorzRange(T nRange)
{
T nTmp = m_nHzRange;
m_nHzRange = nRange;
if (m_MaxHzVal < m_nHzRange) m_MaxHzVal = m_nHzRange * 1.1;
//Normalize();
UpdateScrollInfo();
return nTmp;
}
template<class T>
BOOL CScrollChart<T>::bIsFirstPoint()
{
MAPLINE::const_iterator iterLine = m_mapLines.begin();
while ( (iterLine) != m_mapLines.end() )
{
if ( !(*iterLine).second.m_mapData.empty() )
return FALSE;
++iterLine;
}
return TRUE;
}
template<class T>
void CScrollChart<T>::UpdateScrollInfo()//滚动条滚动消息处理
{
SCROLLINFO si;
si.fMask = SIF_ALL;
si.nPos = SCROLL_VALUE * ( (m_pointIni - m_MinHzVal) / ( m_MaxHzVal - m_MinHzVal ) );;
si.nMin = 0;
si.nMax = SCROLL_VALUE;
si.nPage = SCROLL_VALUE * ( m_nHzRange / ( m_MaxHzVal - m_MinHzVal ) );
SetScrollInfo(SB_HORZ, &si, TRUE);
SendNewLimits();
}
template<class T>
BOOL CScrollChart<T>::ErasePoints()
{
if (!m_nMaxPoints) return FALSE;
BOOL bResult = FALSE;
MAPLINE::iterator iterLine = m_mapLines.begin();
while ((iterLine) != m_mapLines.end())
{
while ( ( (*iterLine).second.m_mapData.size() ) > m_nMaxPoints )
{
(*iterLine).second.m_mapData.erase((*iterLine).second.m_mapData.begin() );
bResult = TRUE;
}
++iterLine;
}
if (bResult)
{
BOOL bFirst=FALSE;
iterLine = m_mapLines.begin();
while ( (!bFirst) && ((iterLine) != m_mapLines.end()) )
{
if ( !((*iterLine).second.m_mapData.empty()) )
{
m_MinHzVal = ( (*((*iterLine).second.m_mapData.begin()) ).first);
bFirst = TRUE;
}
++iterLine;
}
while ((iterLine) != m_mapLines.end())
{
if ( !((*iterLine).second.m_mapData.empty()) )
{
if ( m_MinHzVal > ( (*((*iterLine).second.m_mapData.begin() )).first) )
m_MinHzVal = ( (*((*iterLine).second.m_mapData.begin() )).first);
}
++iterLine;
}
}
return bResult;
}
template<class T>
void CScrollChart<T>::SendNewLimits()
{
if(!m_bNorify) return;
GetParent()->PostMessage (WM_NEWHORZLIMITS,
(T) m_pointIni,
(T) m_pointIni + m_nHzRange );
GetParent()->PostMessage (WM_NEWVERTLIMITS,
(T) m_MinValue, (T) m_MaxValue);
}
template<class T>
void CScrollChart<T>::Normalize()
{
if ( m_pointIni < m_MinHzVal ) m_pointIni = m_MinHzVal;
if ( m_MaxHzVal < m_pointIni + m_nHzRange) m_MaxHzVal = m_pointIni + m_nHzRange;
}
template<class T>
void CScrollChart<T>::OnLButtonDblClk(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
/*/AfxMessageBox("nonthing");
CSetDlg* dlg;
dlg = new CSetDlg(this);
dlg->Create(IDD_SETTING_DLG,NULL);
dlg->ShowWindow(SW_SHOW);
dlg->SetWindowPos(NULL,400,300,0,0,SWP_NOZORDER | SWP_NOSIZE | SWP_NOACTIVATE);
//CScrollChart<T>::OnLButtonDblClk(nFlags, point);*/
}
template<class T>
CString CScrollChart<T>::GetCurrentTime()
{
CTime cntTime;
int iHour;
int iMinute;
int iSecond;
CString cHour;
CString cMinute;
CString cSecond;
CString cCntTime;
cntTime = CTime::GetCurrentTime();
iHour = cntTime.GetHour();
iMinute = cntTime.GetMinute();
iSecond = cntTime.GetSecond();
cHour.Format("%d",iHour);
cMinute.Format("%d",iMinute);
cSecond.Format("%d",iSecond);
cCntTime = cHour+":"+cMinute+":"+cSecond;
//cCntTime = cSecond;
return cCntTime;
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -