近需要用MFC做一个界面动态显示曲线,自己画坐标轴画曲线太费时间,网上也有很多已实现的动态曲线接口,但是也不太灵活。正好微软有个现成的MSChart,功能比较全面,查了一些资料,总算实现了无闪烁的动态曲线。关于MSChart的安装可以参考上篇文章http://www.cnblogs.com/wy-wangyan/archive/2011/05/06/2038981.html
实现的效果截图:
实现的原理:MSChart如果要实现动态的曲线就只能在设置的定时器中根据RowCount,到一定的列数后在最后一列插入新一列(m_Chart.GetDataGrid().InsertRows),将最早出现的那一列删除(m_Chart.GetDataGrid().DeleteRows)。对于无闪烁刷新的实现类似于一般MFC画图中创建双缓冲画图避免屏幕闪烁的方法,这里是用CStatic动态创建一个Picture Control图像控件,将它设定和要画的MSChart一样大,然后把mschart的内容利用m_Chart.EditCopy()复制到剪贴板,然后再在picture control中显示出来。
下面是全部的实现的代码:
MSChart需要在view的oncreate中创建出mschart:
int CRTDBView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: Add your specialized creation code here
CRect rc;
GetClientRect(&rc);
VERIFY(m_Picture.Create(_T(""),SS_BITMAP|WS_CHILD|WS_EX_TRANSPARENT| WS_VISIBLE,CRect(0,0,1200,600),this,IDC_PICTURE));
if(!m_Chart.Create(_T("RTDB"),WS_CHILD| WS_VISIBLE, CRect(0,0,1200,600), this, 10))
return -1;
return 0;
}
在ONSIZE中设置mschart的位置:
void CRTDBView::OnSize(UINT nType, int cx, int cy)
{
CView::OnSize(nType, cx, cy);
// TODO: Add your message handler code here
if( m_Chart.GetSafeHwnd())
m_Chart.MoveWindow( 0, 0, cx, cy );
}
下面是主要实现部分的代码了,InitChart函数实现了mschart的背景、标题、XY坐标刻度以及颜色字体大小、曲线设定颜色以及数据点的显示等。主要是chart的初始化。
void CRTDBView::InitChart(void)
{
// 设置标题
m_Chart.SetTitleText(_T("RTDB"));
// 设置标题颜色
m_Chart.GetTitle().GetVtFont().GetVtColor().Set(0,255,0);
// 改变字体大小
m_Chart.GetTitle().GetVtFont().SetSize(14);
// 改变背景色
m_Chart.GetBackdrop().GetFill().SetStyle(1);
m_Chart.GetBackdrop().GetFill().GetBrush().GetFillColor().Set(0,0,0);