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

📄 cdrawstripchart.cpp

📁 一个wince下画趋势曲线的控件
💻 CPP
📖 第 1 页 / 共 2 页
字号:
			}
			else
			{
				hPen = CreatePen(PS_SOLID,1,m_XminorticsColor);
				SelectObject(hDC,hPen);
			}
			
			if ((i % m_iXminortics) == 0)
			{
				CString str;
				float iPointTime=0;
				float fValue=0;

				long lSize=m_ArrayXYValue.GetSize();
				if(lSize <= 0 ) return;

				iPointTime = rect.right - x;
				iPointTime = iPointTime / (rect.right - rect.left) * m_XSpan;
				
				COleDateTimeSpan dTSpan;
				dTSpan.SetDateTimeSpan(0,0,0,iPointTime);
				COleDateTime curDt = m_LastDt - dTSpan;

				for(int index=0;index<1;index++)
				{
					for(long l=0;l<m_ArrayXYValue[index].m_ArrayValue.GetSize();l++)
					{
						if(m_ArrayXYValue[index].m_ArrayValue[l].m_DataTime==curDt)
						{
							fValue=m_ArrayXYValue[0].m_ArrayValue[l].m_value;
							break;
						}
						else
						{
							fValue=0;
						}
					}
				}
				/*str.Format(_T("%04d-%02d-%02d\n%02d:%02d:%02d\n%.3f"),curDt.GetYear(),curDt.GetMonth(),curDt.GetDay(),
			                                            curDt.GetHour(),curDt.GetMinute(),curDt.GetSecond(),fValue);*/
				/*str.Format(_T("%04d-%02d-%02d\n%02d:%02d:%02d"),curDt.GetYear(),curDt.GetMonth(),curDt.GetDay(),
			                                            curDt.GetHour(),curDt.GetMinute(),curDt.GetSecond());*/
				str.Format(_T("%02d:%02d:%02d"),curDt.GetHour(),curDt.GetMinute(),curDt.GetSecond());

				if(i!=0)
				{
					SetBkMode(hDC,TRANSPARENT);
					SetTextColor(hDC,RGB(255,255,255));
					DrawText(hDC,str,str.GetLength(),CRect(x,y2,x+200,y2+200),DT_LEFT | DT_TOP);
				}
			}
			MoveToEx(hDC,x+off, y1,NULL);
			LineTo(hDC,x+off, y2);
			DeleteObject (SelectObject (hDC, GetStockObject (BLACK_PEN))) ;
		}
		//DeleteObject(hPen); 
		//SelectObject(hDC,GetStockObject(BLACK_PEN));
		break;
	
	case 2:
		/*n = m_iXmajortics * m_iXminortics;
		x1 = rect.left + 1;
		x2 = rect.right - 2;
		for (i = 0; i <= n; i++)
		{
			int y = rect.top + i * rect.Height() / n;
			//int y = rect.bottom  - i * rect.Height() / n;
			
			if ((i % m_iXminortics) == 0)
			{
				hPen = CreatePen(PS_SOLID,1,m_XmajorticsColor);
				SelectObject(hDC,hPen);
				
			}
			else
			{
				hPen = CreatePen(PS_SOLID,1,m_XminorticsColor);
				SelectObject(hDC,hPen);
			}
			if ((i % m_iXminortics) == 0)
			{
				dateTimeSpan.SetDateTimeSpan(0,0,0,m_iXStart / m_iXmajortics * i);
				COleDateTime datetime(m_iXLast - dateTimeSpan);
				//str.Format(_T("%d-%d-%d %d:%d:%d"),datetime.GetYear(),datetime.GetMonth(),datetime.GetDay(),datetime.GetHour(),datetime.GetMinute(),datetime.GetSecond());
				str.Format(_T("%d:%d:%d"),datetime.GetHour(),datetime.GetMinute(),datetime.GetSecond());
				DrawText(hDC,str,str.GetLength(),CRect(x2-100,y,x2,y+100), DT_LEFT | DT_VCENTER);
			}
			MoveToEx(hDC,x1, y,NULL);
			LineTo(hDC,x2, y);
		}
		DeleteObject(hPen); 
		SelectObject(hDC,GetStockObject(BLACK_PEN));*/
		break;
	case 3:
		/*n = m_iXmajortics * m_iXminortics;
		x1 = rect.left + 1;
		x2 = rect.right - 2;
		for (i = 0; i <= n; i++)
		{
			int y = rect.top + i * rect.Height() / n;
			//int y = rect.bottom  - i * rect.Height() / n;
			
			if ((i % m_iXminortics) == 0)
			{
				hPen = CreatePen(PS_SOLID,1,m_XmajorticsColor);
				SelectObject(hDC,hPen);
				
			}
			else
			{
				hPen = CreatePen(PS_SOLID,1,m_XminorticsColor);
				SelectObject(hDC,hPen);
			}
			if ((i % m_iXminortics) == 0)
			{
				dateTimeSpan.SetDateTimeSpan(0,0,0,m_iXStart / m_iXmajortics * i);
				COleDateTime datetime(m_iXLast - dateTimeSpan);
				//str.Format(_T("%d-%d-%d %d:%d:%d"),datetime.GetYear(),datetime.GetMonth(),datetime.GetDay(),datetime.GetHour(),datetime.GetMinute(),datetime.GetSecond());
				str.Format(_T("%d:%d:%d"),datetime.GetHour(),datetime.GetMinute(),datetime.GetSecond());
				DrawText(hDC,str,str.GetLength(),CRect(x2-100,y,x2,y+100), DT_LEFT | DT_VCENTER);
			}
			MoveToEx(hDC,x1, y,NULL);
			LineTo(hDC,x2, y);
		}
		DeleteObject(hPen); 
		SelectObject(hDC,GetStockObject(BLACK_PEN));*/
		break;
	}
}

void CDrawStripChart::SetY(int iYmajortics,int iYminortics,COLORREF YmajorticsColor,COLORREF YminorticsColor)//,int iYMax,int iYMin,int iYDisplayMax,int iYDisplayMin)
{
	m_iYmajortics=iYmajortics;
	m_iYminortics=iYminortics;
	m_YmajorticsColor=YmajorticsColor;
	m_YminorticsColor=YminorticsColor;
}

void CDrawStripChart::DrawY(HDC hDC)
{
	CRect rect= m_GridRect;
	HPEN hPen;
	int i=0;
	int x1=0;
	int x2=0;
	int n=0;
	int x=0;
	int y=0;
	int y1=0;
	int y2=0;

	switch(m_Orientation)//曲线方向0:左至右,1:右至左,2上至下,3下至上
	{
	case 0:

		break;
	case 1:
		
		n = m_iYmajortics * m_iYminortics;
		x1 = rect.left + 1;
		x2 = rect.right - 2;
		for (i = 0; i <= n; i++)
		{
			y = rect.top + i * rect.Height() / n;
			
			if ((i % m_iYminortics) == 0)
			{
				hPen = CreatePen(PS_SOLID,1,m_YmajorticsColor);
				SelectObject(hDC,hPen);
			}
			else
			{
				hPen = CreatePen(PS_SOLID,1,m_YminorticsColor);
				SelectObject(hDC,hPen);
			}

			MoveToEx(hDC,x1, y,NULL);
			LineTo(hDC,x2, y);	
			DeleteObject (SelectObject (hDC, GetStockObject (BLACK_PEN))) ;
		}
		//DeleteObject(hPen); 
		//SelectObject(hDC,GetStockObject(BLACK_PEN));
		break;
	
	case 2:

		break;
	case 3:

		/*n = m_iYmajortics * m_iYminortics;
		y1 = rect.top + 1;
		y2 = rect.bottom - 2;
		for (i = 0; i <= n; i++)
		{
			//x = rect.left + i * rect.Width() / n;
			x = rect.right - i * rect.Width() / n;
			
			if ((i % m_iYminortics) == 0)
			{
				hPen = CreatePen(PS_SOLID,1,m_iYmajortics);
				SelectObject(hDC,hPen);
				
			}
			else
			{
				hPen = CreatePen(PS_SOLID,1,m_iYminortics);
				SelectObject(hDC,hPen);
				
			}
			
			MoveToEx(hDC,x, y1,NULL);
			LineTo(hDC,x, y2);			
			DeleteObject (SelectObject (hDC, GetStockObject (BLACK_PEN))) ;
			
		}*/
		
		
		break;
	}
}

void CDrawStripChart::SetXYCount(int count)
{
	//if(count < 1) return;
	m_ArrayXYValue.SetSize(count);
	m_ArrayOutValue.SetSize(count);

	
}

int CDrawStripChart::GetXYCount()
{
	return m_ArrayXYValue.GetSize();
}

/*void CDrawStripChart::SetXY(int Index,int iYMax,int iYMin)//,int iYDisplayMax,int iYDisplayMin)
{
	m_ArrayXYValue[Index].m_iYMax=iYMax;//最大值
	m_ArrayXYValue[Index].m_iYMin=iYMin;//最小值
	//m_ArrayXYValue[Index].m_iYDisplayMax=iYDisplayMax;//最大显示值
	//m_ArrayXYValue[Index].m_iYDisplayMin=iYDisplayMin;//最小显示值
}*/

//void CDrawStripChart::AddXY(int index,int iYMax,int iYMin,int XSpan,int Timelevel,long color,long Visibled,long lineWidth,long lineType,long Excursion,COleDateTime DateTime,long value)
void CDrawStripChart::AddXY(int index,int iYMax,int iYMin,int Timelevel,long color,long Visibled,long lineWidth,long lineType,long Excursion,COleDateTime DateTime,float value)
{
	//if(index < m_ArrayXYValue.GetSize()) return;
	m_ArrayXYValue[index].m_iYMax = iYMax;
	m_ArrayXYValue[index].m_iYMin = iYMin;
	//m_ArrayXYValue[index].m_XSpan = XSpan;
	m_ArrayXYValue[index].m_color = color;//颜色
	m_ArrayXYValue[index].m_Visibled = Visibled;//是否可见
	m_ArrayXYValue[index].m_lineWidth = lineWidth;//线宽
	m_ArrayXYValue[index].m_lineType = lineType;//线型 0:直线;1:点;
	m_ArrayXYValue[index].m_Excursion = Excursion;//曲线偏移
	m_ArrayXYValue[index].Add(DateTime,value); 

	if(m_LastDt<DateTime) m_LastDt=DateTime;

}

void CDrawStripChart::SetXYPrt(int index,int iYMax,int iYMin,int Timelevel,long color,long Visibled,long lineWidth,long lineType,long Excursion)
{
	//if(index < m_ArrayXYValue.GetSize()) return;
	m_ArrayXYValue[index].m_iYMax = iYMax;
	m_ArrayXYValue[index].m_iYMin = iYMin;
	m_ArrayXYValue[index].m_color = color;//颜色
	m_ArrayXYValue[index].m_Visibled = Visibled;//是否可见
	m_ArrayXYValue[index].m_lineWidth = lineWidth;//线宽
	m_ArrayXYValue[index].m_lineType = lineType;//线型 0:直线;1:点;
	m_ArrayXYValue[index].m_Excursion = Excursion;//曲线偏移
}

void CDrawStripChart::AddXYValue(int index,COleDateTime DateTime,float value)
{
	if(index > m_ArrayXYValue.GetSize()-1) return;
	m_ArrayXYValue[index].Add(DateTime,value); 

	if(m_LastDt<DateTime) m_LastDt=DateTime;
}

void CDrawStripChart::DrawCurve(HDC hDC)
{
	RECT rect= m_GridRect;
	long x=0;
	long y=0;
	long l=0;
	int indexArray=0;
	int index=0;
	long Excursion=0;
	COleDateTimeSpan dateTimeSpan;
	long start=0;
	long end=0;

	switch(m_Orientation)//曲线方向0:左至右,1:右至左,2上至下,3下至上
	{
	case 0:
	case 1:
			
		indexArray=0;
		for(indexArray=0;indexArray < m_ArrayXYValue.GetSize();indexArray++)
		{
			if(m_ArrayXYValue[indexArray].m_Visibled==0) continue;
			if(m_ArrayXYValue[indexArray].m_ArrayValue.GetSize()<=0) continue;
	
			if(m_ArrayXYValue[indexArray].m_ArrayValue.GetSize() < m_XSpan)
			{
				start=0;
				end=m_ArrayXYValue[indexArray].m_ArrayValue.GetSize();
			}
			else
			{
				end=m_ArrayXYValue[indexArray].m_ArrayValue.GetSize();
				start=end-m_XSpan;
			}

			index=0;

			for(index=start; index < end;index++)
			{
				HPEN hPen = CreatePen(PS_SOLID,m_ArrayXYValue[indexArray].m_lineWidth,m_ArrayXYValue[indexArray].m_color);
				SelectObject(hDC,hPen);
			
				dateTimeSpan = m_ArrayXYValue[indexArray].m_ArrayValue[end-1].m_DataTime - m_ArrayXYValue[indexArray].m_ArrayValue[index].m_DataTime;
				
				l=(long)dateTimeSpan.GetTotalSeconds();

				if(l>=m_XSpan)
				{
					l=m_XSpan;
				}
				x =  (rect.right- rect.left) - ((rect.right - rect.left) * l /  m_XSpan ) ;

				if(m_ArrayXYValue[indexArray].m_Excursion<=0)
				{
					y = rect.bottom - (rect.bottom - rect.top)  * (m_ArrayXYValue[indexArray].m_ArrayValue[index].m_value-m_ArrayXYValue[indexArray].m_iYMin) / (m_ArrayXYValue[indexArray].m_iYMax - m_ArrayXYValue[indexArray].m_iYMin);
				}
				else
				{
					Excursion = (rect.bottom - rect.top) / m_ArrayXYValue[indexArray].m_Excursion;
					y = rect.bottom - (rect.bottom - rect.top)  * (m_ArrayXYValue[indexArray].m_ArrayValue[index].m_value-m_ArrayXYValue[indexArray].m_iYMin) / (m_ArrayXYValue[indexArray].m_iYMax - m_ArrayXYValue[indexArray].m_iYMin);
					y=y-Excursion;
				}

				//CFile f(_T("\\harddisk\\info.txt"),CFile::modeWrite);
				//CString str;
				//str.Format(_T("rect.width=%d,l=%d,m_XSpan=%d,x=%d\r\n"),rect.right- rect.left,l,m_XSpan,x);
				//f.SeekToEnd(); 
				//f.Write(str,str.GetLength()*2);
				//f.Close();

				if(x>rect.right)
				{
					x=rect.right;
				}
				if(x<rect.left)
				{
					x=rect.left;
				}

				if(y>rect.bottom)
				{
					y=rect.bottom;
				}
				if(y<rect.top)
				{
					y=rect.top;
				}

				if(index == start)// ||  l > m_offTime )
				{
					MoveToEx(hDC,x,y,NULL);
				}
				else
				{
					LineTo(hDC,x,y);
				}
	
				DeleteObject (SelectObject (hDC, GetStockObject (BLACK_PEN))) ;
			}
			
			
		}
		break;

	case 2:
	case 3:
		break;
	}
}

void CDrawStripChart::SetCursorPoint(CPoint point)
{
	m_Point=point;
}

void CDrawStripChart::SetClickPoint(CPoint point,int clickFlag)
{
	m_ClickPoint=point;
	m_clickFlag=clickFlag;
}

void CDrawStripChart::DrawCursor(HDC hDC)
{
	CRect rect=m_GridRect;
	float iPointTime=0;
	float fValue=0;

	if(PtInRect(rect,m_Point)!=0)
	{
		HPEN hPen = CreatePen(PS_SOLID,2,RGB(255,0,0));
		SelectObject(hDC,hPen);
		
		CString str;
		long lSize=m_ArrayXYValue.GetSize();
		if(lSize <= 0 ) return;

		iPointTime = rect.right - m_Point.x;
		iPointTime = iPointTime / (rect.right - rect.left) * m_XSpan;
		
		COleDateTimeSpan dTSpan;
		dTSpan.SetDateTimeSpan(0,0,0,iPointTime);
		m_curDt = m_LastDt - dTSpan;
		
		for(int i=0;i<1;i++)
		{
			for(long l=0;l<m_ArrayXYValue[i].m_ArrayValue.GetSize();l++)
			{
				if(m_ArrayXYValue[i].m_ArrayValue[l].m_DataTime==m_curDt)
				{
					m_ArrayOutValue[i]=m_ArrayXYValue[i].m_ArrayValue[l].m_value;
					break;
				}
				else
				{
					fValue=0;
				}
			}
		}
		/*for(int i=0;i<1;i++)
		{
			for(long l=0;l<m_ArrayXYValue[i].m_ArrayValue.GetSize();l++)
			{
				if(m_ArrayXYValue[i].m_ArrayValue[l].m_DataTime==curDt)
				{
					fValue=m_ArrayXYValue[0].m_ArrayValue[l].m_value;
					break;
				}
				else
				{
					fValue=0;
				}
			}
		}*

		/*str.Format(_T("%04d-%02d-%02d\n%02d:%02d:%02d\n%.3f"),curDt.GetYear(),curDt.GetMonth(),curDt.GetDay(),
			                                            curDt.GetHour(),curDt.GetMinute(),curDt.GetSecond(),fValue);
		DrawText(hDC,str,str.GetLength(),CRect(m_Point.x,m_Point.y,m_Point.x+200,m_Point.y+200),DT_LEFT | DT_TOP);*/
		
		MoveToEx(hDC,rect.left, m_Point.y,NULL);
		LineTo(hDC,rect.right, m_Point.y);

		MoveToEx(hDC,m_Point.x, rect.top,NULL);
		LineTo(hDC,m_Point.x, rect.bottom);

		DeleteObject (SelectObject (hDC, GetStockObject (BLACK_PEN)));
	}
}

void CDrawStripChart::Draw(HDC hDC)
{
	DrawRect(hDC);
	DrawGridRect(hDC);
	DrawX(hDC,0);
	DrawY(hDC);
	DrawLGRect(hDC);
	DrawCurve(hDC);
	if(m_iDrawCursorFlag==1)
	{
		DrawCursor(hDC);
	}
}

⌨️ 快捷键说明

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