可能有不少的地方都要做这样的动态的曲线图的来表达流量的动态情况。我这里做了一个这样的CStatic控件的类。能动态的显示出流量的趋势
主要就重载CStatic类的OnPaint函数。
使用一个
typedef vector
来保存当前需要连结的点。
在OnPaint函数里写好这样的内容就行了。
void CMyStatic::OnPaint()
{
CPaintDC dc(this);
DrawBK(dc);
if (m_PointArr.size()>=2)
{
for(int i=0;i
DrawLine(dc,m_PointArr[i],m_PointArr[i+1],m_ColorLi);
}
}
}
画背景的函数为:
void CMyStatic::DrawBK(CDC& dc)
{
CRect rect;
GetClientRect(&rect);
dc.FillSolidRect(&rect,m_ColorBk);
this->GetWindowRect(&rect);
ScreenToClient(&rect);
CSize TGSize;
TGSize.cx = rect.right - rect.left;
TGSize.cy = rect.bottom - rect.top;
//横线
int nH=TGSize.cy/20;
for(int i=1;i<=nH;i++)
{
CPoint p1(rect.left,rect.top+20*i);
CPoint p2(rect.right,rect.top+20*i);
DrawLine(dc,p1,p2,m_ColorFram);
}
//图竖线
int nZ=TGSize.cx/20;
for( i=1;i<=nZ;i++)
{
CPoint p1(rect.left+20*i,rect.top);
CPoint p2(rect.left+20*i,rect.bottom);
DrawLine(dc,p1,p2,m_ColorFram);
}
}
void CMyStatic::DrawLine(CDC& dc,CPoint _p1,CPoint _p2,COLORREF _color)
{
CPen newPen(PS_SOLID,1,_color);
CPen* oldPen=dc.SelectObject(&newPen);
dc.MoveTo(_p1);
dc.LineTo(_p2);
dc.SelectObject(oldPen);
}
void CMyStatic::AddPoint(int nCount)
{
nCount=100-nCount;
TRACE("加入的点的y轴的内容:%d/n",nCount);
CRect rect;
GetClientRect(&rect);
//移动以前的
for(int i=0;i
m_PointArr[i].Offset(-10,0);
}
//是不是太多
int nZ=rect.Width()/10+1;
if (m_PointArr.size()>=nZ)
{
m_PointArr.erase(m_PointArr.begin());
CPoint temp=m_PointArr[m_PointArr.size()];
temp.x=rect.left;
m_PointArr[m_PointArr.size()]=temp;
}
/*转换成100%*/
CPoint point(rect.right,rect.Height()*nCount/100);
m_PointArr.push_back(point);
Invalidate();
}