MsChart实现无闪烁动态曲线(MFC)
### MsChart 实现无闪烁动态曲线 (MFC) 在探讨如何使用MsChart在MFC框架下实现无闪烁动态曲线之前,我们先来了解几个关键概念和技术背景。 #### MsChart简介 MsChart是Microsoft提供的一种图表控件,它可以方便地集成到Windows应用程序中,用于展示各种类型的数据图形,如折线图、柱状图等。由于其易用性和丰富的功能,MsChart被广泛应用于数据可视化领域,尤其是在早期的Windows开发中非常流行。 #### MFC框架 MFC(Microsoft Foundation Classes)是微软为简化Windows应用程序开发而提供的一套类库。它基于C++语言,提供了大量封装好的API,使得开发者可以更专注于业务逻辑而非底层细节。MFC支持多种控件和窗口操作,包括MsChart在内的许多控件都能很好地与MFC集成。 #### 双缓冲技术 在Windows图形界面开发中,为了避免屏幕更新时出现闪烁现象,通常会采用双缓冲技术。该技术的基本原理是在内存中创建一个与屏幕显示区域相同大小的“缓冲区”,所有绘图操作都在这个缓冲区内完成,然后一次性将缓冲区的内容复制到屏幕上,这样可以显著减少屏幕闪烁问题。 ### 如何实现无闪烁动态曲线 为了实现无闪烁的动态曲线,我们需要考虑以下几个关键步骤: 1. **初始化MsChart控件**: - 创建MsChart控件,并设置其属性。 - 初始化图表标题、字体颜色、背景色等样式配置。 - 设置图表的类型(例如:2D或3D)、列数、行数等基本参数。 2. **创建双缓冲机制**: - 使用MFC提供的`CStatic`类或者`CPictureControl`类创建一个用于绘图的控件作为双缓冲区。 - 在这个缓冲区内绘制MsChart的内容。 - 将缓冲区的内容一次性复制到实际的显示区域。 3. **动态更新曲线**: - 定期获取新的数据点。 - 更新MsChart中的数据。 - 重新绘制缓冲区,并将内容复制到显示区域。 下面是一段示例代码,展示了如何在MFC应用程序中实现上述步骤: ```cpp // 在视图类CRTDBView中定义成员变量 CStatic m_Picture; // 用于创建双缓冲区 CMsChart m_Chart; // MsChart控件 // 在CRTDBView的OnCreate函数中初始化MsChart和双缓冲区 int CRTDBView::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CView::OnCreate(lpCreateStruct) == -1) return -1; 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)); // 创建并初始化MsChart if (!m_Chart.Create(_T("RTDB"), WS_CHILD | WS_VISIBLE, CRect(0, 0, 1200, 600), this, 10)) return -1; InitChart(); // 调用初始化图表的函数 return 0; } // 处理窗口大小变化事件 void CRTDBView::OnSize(UINT nType, int cx, int cy) { CView::OnSize(nType, cx, cy); if (m_Chart.GetSafeHwnd()) m_Chart.MoveWindow(0, 0, cx, cy); } // 初始化图表的样式和数据 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); // 设置图表的其他属性 m_Chart.SetShowLegend(TRUE); m_Chart.SetColumn(1); m_Chart.SetColumnLabel((LPCTSTR)_T("pointnum")); m_Chart.SetRowCount(15); m_Chart.SetRow(1); // 初始化数据 for (UINT i = 1; i <= m_Chart.GetRowCount(); i++) { m_Chart.GetDataGrid().SetData(i, 1, 0, 0); } // 设置图表类型和系列类型 m_Chart.SetChartType(1 | 2); m_Chart.SetSeriesType(11); // 设置坐标轴标题和其他属性 VARIANT var; m_Chart.GetPlot().GetAxis(0, var).GetAxisTitle().SetText(_T("时间(s)")); m_Chart.GetPlot().GetAxis(1, var).GetAxisTitle().SetText(_T("")); m_Chart.GetPlot().GetAxis(0, var).GetCategoryScale().SetAuto(FALSE); } // 动态更新曲线 void CRTDBView::UpdateCurve() { // 获取新数据 double newData = ...; // 假设这是一个新的数据点 // 更新MsChart中的数据 m_Chart.GetDataGrid().SetData(m_Chart.GetRowCount(), 1, newData, 0); // 重绘MsChart m_Chart.Invalidate(); // 将MsChart的内容复制到双缓冲区 m_Chart.EditCopy(); m_Picture.EditPaste(); // 将双缓冲区的内容复制到显示区域 m_Picture.RedrawWindow(NULL, NULL, RDW_INVALIDATE | RDW_UPDATENOW | RDW_ALLCHILDREN); } ``` 通过以上步骤,我们可以在MFC应用程序中实现一个无闪烁的动态曲线图。这种方法不仅能够提高用户体验,还能确保程序运行更加流畅稳定。
实现的效果截图:
实现的原理: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);
剩余7页未读,继续阅读
- 粉丝: 2
- 资源: 11
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 学校课程软件工程常见10道题目以及答案demo
- javaweb新手开发中常见的目录结构讲解
- 新手小白的git使用的手册入门学习demo
- 基于Java观察者模式的info-express多对多广播通信框架设计源码
- 利用python爬取豆瓣电影评分简单案例demo
- 机器人开发中常见的几道问题以及答案demo
- 基于SpringBoot和layuimini的简洁美观后台权限管理系统设计源码
- 实验报告五六代码.zip
- hdw-dubbo-ui基于vue、element-ui构建开发,实现后台管理前端功能.zip
- (Grafana + Zabbix + ASP.NET Core 2.1 + ECharts + Dapper + Swagger + layuiAdmin)基于角色授权的权限体系.zip
- 1
- 2
前往页