High-speed Charting Control--MFC绘制图表(折线图、饼图、柱形图)控件
- 格式:doc
- 大小:774.00 KB
- 文档页数:24
MFC/VC++调用word进行报表制作使用word进行数据报告的制作可谓非常方便,word具有非常强大的编辑、排版功能。
使用word能够制作出内容丰富、样式精美的报告。
我们在工作中当然会有报表报告的需求,如果能够在MFC/VC++里面能够调用word进行word格式报告的自动生成,岂不是一件非常惬意的事情。
我在工作当中需要对大量的数据或者各种测试数据进行统计分析,最终的统计分析结果总归要汇总为一份报告,不管是内部使用也好还是外部提供给客户也好,一份内容翔实、格式精美的报告自然必不可少。
我对MFC/VC++也不是高手,只是业余爱好自己动动手做些东西。
自然,低于VC操作word可谓完全没有经验,在网络上面也查找了很多资料,都是些只言片语,不能真正的领略通过VC使用word的方法。
于是自己摸索了几个礼拜,可谓耗时甚长,劳心劳力啊。
MS的东西,封装的也太严实了,对于函数部分只有些许的简单介绍,往往看的云里雾里。
没有实践还是不行啊!体会自己的经历,虽然辛苦但也有收获。
不想其他朋友再继续走我走过的路,浪费时间、精力,故成文以共享。
废话少说,进入正题吧。
第一步,当然我们需要首先导入word需要的库。
通过ClassWizard->Add Class选择From a Type Library…定位需要的库文件导入。
本例应该使用C:"Program Files"Microsoft Office"OFFICE11"MSWORD.OLB,在这里尽可选择所有的类导入,反正用的时候都有了,呵呵。
完成这一步,我们得到两个文件msword.h和msword.cpp,那就加入你的工程吧。
说明:如果需要在VC++/MFC开发程序操作word/excel等office 元素,那么需要对必要的类型库进行导入.下面是office系列的类型库参考,导入类型库时候请选择正确的类型库进行导入.应用程序类型库Microsoft Access 97Microsoft Binder 97 Microsoft Excel 97 Microsoft Graph 97 Microsoft Office 97 MsoMicrosoft Outlook 97 Microsoft PowerPoint 97 Microsoft Word 97 Microsoft Access 2000Microsoft Binder 2000 Microsoft Excel 2000 Microsoft Graph 2000 Microsoft Office 2000 Microsoft Outlook 2000 Microsoft PowerPoint 2000 Microsoft Word 2000 Microsoft Access 2002 Microsoft Excel 2002 Microsoft Graph 2002Microsoft Office 2002Microsoft Outlook 2002 Microsoft PowerPoint 2002 Microsoft Word 2002Microsoft Office Access 2003 Microsoft Office Excel 2003 Microsoft Office Graph 2003 Microsoft Office 2003Microsoft Office Outlook 2003 Microsoft Office PowerPoint 2003 Microsoft Office Word 2003注意:这些类型库的默认位置是:Office 版本路径Office 97C:"Program Files"Microsoft Office"OfficeOffice 2000C:"Program Files"Microsoft Office"OfficeOffice XPC:"Program Files"Microsoft Office"Office10Office 2003C:"Program Files"Microsoft Office"Office11Dao350.dll 和Dao360.dll 的默认位置是C:"Program Files"Common Files"Microsoft Shared"Dao。
H i g h s p e e d C h a r t i n g C o n t r o l M F C绘制图表折线图饼图柱形图控件The latest revision on November 22, 2020High-speed Charting Control--MFC绘制图表(折线图、饼图、柱形图)控件介绍对于我之前的一个项目,我需要在图表控件上显示连续的数据流。
我决定开发自己的控件,因为我找不到任何可以提供所需灵活性的自由软件控件。
其中一个主要的限制是,控件必须绘制大量的数据,并能够迅速显示它(在Pocket PC上)。
控件能够通过仅绘制新的数据点而不是完整的数据序列来做到这一点并且图表还能够显示静态数据。
这种控件是我长时间工作的结果,而且费尽周折地为了提供足够的灵活性来供需要它的人使用。
对于使用者反馈我表示由衷的感谢:一个邮件,留言板中的一一句话或只是对本文评级。
当我不知道是否还有人使用它时,我就没有必要维护这个控件了。
免责声明这个控件是我花费很长时间的开发的结果,因此我对代码的使用放置一些小条件:该代码可以以编译的形式用于任何非商业和商业目的。
代码可以被重新开发,只要它提供作者名字和完整的免责声明。
更改源代码需要得到作者的同意。
此代码不提供任何安全保证。
我不会对使用此代码造成的损失负责。
使用它需要自己承担风险。
This code may be used for any non-commercialand commercial purposes in a compiled form.The code may be redistributed as long as it remainsunmodified and providing that the author nameand the disclaimer remain intact. The sourcescan be modified with the author consent only.This code is provided without any guarantees.I cannot be held responsible for the damage orthe loss of time it causes. Use it at your own risks.鉴于开发这个控件所付出的努力,下面的要求并不过分:如果你在在商业应用程序中使用这个控件,那么请给我发邮件让我知道。
MFC画图程序步骤MFC(Microsoft Foundation Class)是一种用于开辟Windows应用程序的C++类库。
在MFC中,我们可以使用GDI(Graphics Device Interface)来创建和操作图形。
下面是使用MFC创建一个简单的画图程序的步骤。
步骤1:创建一个新的MFC项目首先,打开Visual Studio并选择创建一个新的项目。
在项目类型中,选择Visual C++ -> MFC,然后选择MFC应用程序类型。
输入项目名称并选择保存的位置。
在应用程序类型中,选择“单文档”或者“多文档”视图,具体根据你的需求而定。
点击“确定”按钮创建项目。
步骤2:设计用户界面在MFC应用程序中,用户界面是通过对话框资源来设计的。
在资源视图中,双击IDD_DIALOG(或者其他对话框资源)以打开对话框编辑器。
在对话框编辑器中,你可以添加按钮、文本框、菜单等控件来设计你的用户界面。
在画图程序中,你可以添加一个画布控件来显示绘制的图形。
步骤3:添加绘图功能在MFC中,你可以使用GDI来进行绘图操作。
打开你的对话框类的头文件(例如,CMyDialog.h),添加以下头文件引用:#include <afxwin.h>#include <afxext.h>#include <afxdisp.h>在对话框类的源文件(例如,CMyDialog.cpp)中,添加以下代码来处理绘图操作:```void CMyDialog::OnPaint(){CPaintDC dc(this); // 用于绘制的设备上下文// 在这里进行绘图操作dc.Rectangle(100, 100, 200, 200); // 绘制一个矩形dc.Ellipse(300, 100, 400, 200); // 绘制一个椭圆}```步骤4:处理绘图事件在对话框类的消息映射中添加对绘图事件的处理。
实验四 MFC图形绘制编程实验一、实验目的(1) 熟悉Visual C++ 6.0开发环境;(2) 掌握MFC消息映射的操作步骤;(2) 掌握MFC图形输出的方法;(3) 理解设备环境、画笔、画刷的概念,掌握常用的绘图函数。
二、实验内容请编写程序,要求如下:(1) 定义一支黄色画笔,绘制一条线段;(1) 定义一支紫色画笔,绘制一条多段线;(3) 定义一支红色画笔,绘制一个正方形,并用适当的画刷填充图形内部;(4) 定义一支绿色画笔,绘制一个圆,并用适当的画刷填充图形内部;(5) 定义一支蓝色画笔,绘制一个正六边形,并用适当的画刷填充图形内部。
三、实验报告1.列出图形绘制程序代码清单:(1)在头文件Demo.h中:#include "afxwin.h"class CDemoWnd:public CFrameWnd{public:CDemoWnd();~CDemoWnd();public:LRESULT OnPaint(WPARAM wParam,LPARAM lParam);DECLARE_MESSAGE_MAP()public:int m_nX0;int m_nY0;int m_nX1;int m_nY1;};class CDemoApp:public CWinApp{public:BOOL InitInstance();};CDemoApp ThisApp;(2)在源文件Demo.cpp中:#include "tpd1.h"CDemoWnd::CDemoWnd(){m_nX0 = 0;m_nY0 = 0;m_nX1 = 0;m_nY1 = 0;}CDemoWnd::~CDemoWnd(){}BEGIN_MESSAGE_MAP(CDemoWnd,CFrameWnd)ON_MESSAGE(WM_PAINT,OnPaint)END_MESSAGE_MAP()LRESULT CDemoWnd::OnPaint(WPARAM wParam,LPARAM lParam) {CPaintDC dc(this);CPen Pen1,*pOldPen1;Pen1.CreatePen(PS_SOLID,10,RGB(255,255,0));pOldPen1=dc.SelectObject(&Pen1);dc.SelectObject(&Pen1);dc.MoveTo(10,10);dc.LineTo(100,100);CPen Pen2,*pOldPen2;Pen2.CreatePen(PS_SOLID,4,RGB(255,0,255));pOldPen2=dc.SelectObject(&Pen2);dc.SelectObject(&Pen2);POINT pt1[]={{100,10},{10,180},{200,150}};dc.Polyline(pt1,3);CPen Pen3,*pOldPen3;dc.SelectStockObject(BLACK_BRUSH);Pen3.CreatePen(PS_SOLID,4,RGB(255,0,0));pOldPen3=dc.SelectObject(&Pen3);dc.SelectObject(&Pen3);dc.Rectangle(300,50,400,150);CPen Pen4,*pOldPen4;dc.SelectStockObject(GRAY_BRUSH);Pen4.CreatePen(PS_SOLID,4,RGB(0,255,0));pOldPen4=dc.SelectObject(&Pen4);dc.SelectObject(&Pen4);dc.Ellipse(500,200,700,400);CPen Pen5,*pOldPen5;Pen5.CreatePen(PS_SOLID,4,RGB(0,0,255));pOldPen5=dc.SelectObject(&Pen5);dc.SelectStockObject(DKGRAY_BRUSH);dc.SelectObject(&Pen5);POINT pt2[]={{250,250},{400,250},{475,379},{400,509},{250,509},{175,379}};dc.Polygon(pt2,6);return 0;}BOOL CDemoApp::InitInstance(){CDemoWnd *pMainWnd = new CDemoWnd();pMainWnd->Create(NULL,"Demo Mini-MFC");pMainWnd->ShowWindow(m_nCmdShow);pMainWnd->UpdateWindow();m_pMainWnd = pMainWnd;return TRUE;}2、程序运行结果:3、总结在MFC 程序中绘制图形的基本操作步骤:(1)获取图形设备接口。
MFC 一个简单的绘图程序涉及到的知识点:1. 鼠标信息的处理,2. 文档和视图的关系,3. 新建一个类及其使用方法的技巧,4. 改变窗口大小或者刷新窗口后原来所绘制的图形没有显示出来的问题。
绘制图形的原理:鼠标被用作画笔,绘图过程中要进行不同的鼠标消息的处理,如按下鼠标,移动鼠标和释放鼠标。
当用户按下鼠标左键是必须记录鼠标当前的位置,并捕获鼠标,设置光标形状;当移动鼠标时,先判断鼠标左键是否同时被按住,如果是则从上一个鼠标位置到当前鼠标位置绘制一条直线。
并保存当前鼠标位置点,供绘制下一段直线用,当释放鼠标左键时将鼠标释放给系统。
一、简单绘图程序程序的实现1.使用MFC AppWizard 应用程序向导创建一个SDI应用程序MyDraw,在视图类CMyDrawView.h中添加如下代码:protected: // create from serialization onlyCMyDrawView();DECLARE_DYNCREATE(CMyDrawView)CPoint m_ptOrigin; //起始点坐标bool m_bDragging; //鼠标是否处于拖拽状态标记HCURSOR m_hCross;//拖拽状态时鼠标的样式2. 在构造函数中对拖拽标记和鼠标样式进行初始化CMyDrawView::CMyDrawView(){// TODO: add construction code herem_bDragging=false;//初始化为falsem_hCross=AfxGetApp()->LoadStandardCursor(IDC_CROSS);//十字光标}3. 使用类向导为视图类添加按下鼠标左键,移动鼠标,释放鼠标左键的消息处理函数。
代码分别为:void CMyDrawView::OnLButtonDown(UINT nFlags, CPoint point) //按下鼠标左键{// TODO: Add your message handler code here and/or call default SetCapture();::SetCursor(m_hCross);m_ptOrigin=point;m_bDragging=true;CView::OnLButtonDown(nFlags, point);}void CMyDrawView::OnLButtonUp(UINT nFlags, CPoint point) //释放鼠标左键{ // TODO: Add your message handler code here and/or calldefault if(m_bDragging){m_bDragging=false;ReleaseCapture();}CView::OnLButtonUp(nFlags, point);}void CMyDrawView::OnMouseMove(UINT nFlags, CPoint point) //移动鼠标{// TODO: Add your message handler code here and/or callif(m_bDragging){//CMyDrawDoc * pDoc=GetDocument();//ASSERT_VALID(pDoc);//pDoc->AddLine(m_ptOrigin,point);CClientDC dc(this);dc.MoveTo(m_ptOrigin);dc.LineTo(point);m_ptOrigin=point;}CView::OnMouseMove(nFlags, point);}4.在MyDraw.CPP中设置窗口标题m_pMainWnd->SetWindowText("简单的绘图程序");此后,编译、链接,运行程序后可以将鼠标当作一个画笔绘制曲线了。
MFC画图的基本方法1.画笔类,CPen,创建画笔类的对象后,需要调用CreatePen(......)函数创建画笔。
然后将其选入设备描述表中。
pDC->SelectObject(.......);2.设置起点坐标。
在这里调用一个函数来设置坐标原点。
pDC->SetViewportOrg(100,255);3.调用LineTo(point),MoveTo(Point)函数画图。
4.删除创建的画笔对象。
pen.DeleteObject();以下是今天所写的画正弦函数的图像。
创建一个单文档的应用程序。
并且在VIEW类中的OnDraw(。
)函数里面做消息响应。
由于调用了sin()函数,所以要把math.h头文件包含进来。
#include "math.h"void CDrawSinXView::OnDraw(CDC* pDC){CDrawSinXDoc* pDoc = GetDocument();ASSERT_V ALID(pDoc);// TODO: add draw code for native data here//建立画笔CPen pen_Zuobixi,pen_sinx;pen_Zuobixi.CreatePen(PS_SOLID,4,RGB(0,0,0));pen_sinx.CreatePen(PS_SOLID,2,RGB(0,0,255));pDC->SelectObject(&pen_Zuobixi);//指定原点pDC->SetViewportOrg(100,255);pDC->SetTextColor(RGB(255,0,0));//绘制横坐标CString sPIText[]={"-1/2π","","1/2π","π","3/2π","2π","5/2π","3π","7/2π","4π","9/2π","5π"};int n=-1;int nTemp=0;while (nTemp<=660){pDC->LineTo(60*n,0);pDC->LineTo(60*n,-5);pDC->MoveTo(60*n,0);pDC->TextOut(60*n-sPIText[n+1].GetLength()*3,16,sPIText[n+1]);n++;nTemp +=60;}pDC->MoveTo(0,0);CString strTemp;//绘制纵坐标for(n=-4,nTemp = 0;nTemp<=180;n++,nTemp+=60) {pDC->LineTo(0,60*n);pDC->LineTo(5,60*n);pDC->MoveTo(0,60*n);strTemp.Format("%d",-n);pDC->TextOut(10,60*n,strTemp);}double y,radian;pDC->SelectObject(&pen_sinx);for(int x=-60;x<600;x++){//弧度=X坐标/曲线宽度*角系数*π//Y坐标=振幅*曲线宽度*sin(弧度)radian =x/((double)60*2)*PI;y=sin(radian)*2*60;pDC->MoveTo((int)x,(int)y);pDC->LineTo((int)x,(int)y);}pen_sinx.DeleteObject();。
MFC中MSChart的使用示例最近由于工作的原因,接触了一些MSChart的东西。
在查看的资料的时候发现,网上很多资料是关于在VB和C#中利用MSChart实现图表的绘制,但关于在MFC中利用MSChart 实现图表绘制的资料甚少,因此在做的过程中遇到了很多问题,下面对MFC中使用MSChart 进行简单的小结:1.添加MSChart点击VS中的“工具-选择工具箱-COM组件”,找到Microsoft Chart Control,version 6.0(OLEDB)并勾选(注:如果COM组件中不存在该项,便可自行安装,从网上下载MSChart.exe 和MSCHART20.OCX。
首先安装MSChart.exe,然后注册MSCHART20.OCX,如果是win7下要用管理方式运行注册,方可成功)。
如下所示:2.在对话框中添加MSChart控件这个比较简单,在此不再赘述,如下所示:3.属性设置MSChart控件的属性及说明如下,可根据需要自行设置。
ChartAreas:增加多个绘图区域,每个绘图区域包含独立的图表组、数据源,用于多个图表类型在一个绘图区不兼容时。
AlignmentOrientation:图表区对齐方向,定义两个绘图区域间的对齐方式。
AlignmentStyle:图表区对齐类型,定义图表间用以对其的元素。
AlignWithChartArea:参照对齐的绘图区名称。
InnerPlotPosition:图表在绘图区内的位置属性。
Auto:是否自动对齐。
Height:图表在绘图区内的高度(百分比,取值在0-100 )Width:图表在绘图区内的宽度(百分比,取值在0-100 )X,Y:图表在绘图区内左上角坐标Position:绘图区位置属性,同InnerPlotPosition。
Name:绘图区名称。
Axis:坐标轴集合Title:坐标轴标题TitleAlignment:坐标轴标题对齐方式Interval:轴刻度间隔大小IntervalOffset:轴刻度偏移量大小MinorGrid:次要辅助线MinorTickMark:次要刻度线MajorGrid:主要辅助线MajorTickMark:主要刻度线DataSourceID:MSChart的数据源。
MFC中简单绘图控制首先建立Graphic2单文档应用程序,在菜单栏帮助菜单后面,新建名为绘图的菜单项,并在其下面新建四个子菜单:IDM_DOT点, IDM_LINE直线,IDM_RECTANGLE矩形, IDM_ELLIPSE椭圆,并在视类中添加其对应的响应函数。
同时添加一变量:private: int m_pt用以标志用户的选择。
点:m_pt=1;直线:m_pt=2,矩形:m_pt=3;椭圆:m_pt=4。
再添加鼠标左键按下和弹起响应函数。
再添加一成员变量,用以保存左键按下时的坐标:private:CPoint m_ptOrigin;void CGraphic2View::OnLButtonDown(UINT nFlags, CPoint point){// TODO: Add your message handler code here and/or call defaultm_ptOrigin=point;CView::OnLButtonDown(nFlags, point);}void CGraphic2View::OnLButtonUp(UINT nFlags, CPoint point){// TODO: Add your message handler code here and/or call default CClientDC dc(this);CPen pen;//设定画笔pen.CreatePen(PS_SOLID,2,RGB(255,0,0));CPen *pOldpen=dc.SelectObject(&pen);CBrush*Brush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));//设定透明画刷CBrush *pOldBrush=dc.SelectObject(Brush);switch(m_pt){case 1:dc.SetPixel(point,RGB(255,0,0));break;case 2:dc.MoveTo(m_ptOrigin);dc.LineTo(point.x,point.y);break;case 3:dc.Rectangle(CRect(m_ptOrigin,point));break;case 4:dc.Ellipse(m_ptOrigin.x,m_ptOrigin.y,point.x,point.y);break;}dc.SelectObject(&pOldpen);dc.SelectObject(&pOldBrush);CView::OnLButtonUp(nFlags, point);}CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));CBrush::FromHa ndle:Returns a pointer to a CBrush object when given a handle to a Windows HBRUSH object.这个函数的意义是将从windows返回的HBrush句柄转换成一个CBrush的指针,这里有一个问题那就是GetStockObject返回的句柄不是HBrush 的,而是HGDIOBJ的,因此我们还需要进行强制转化.改变线宽:首先新建一对话框:ID=IDM_DLG_SETTING;caption=setting;添加一静态文本:caption=线宽;添加一编辑框:ID=IDM_LINE_WIDTH.建立一个与对话框对应的类,类名为CSettingDlg。
High-speed Charting Control--MFC绘制图表(折线图、饼图、柱形图)控件介绍对于我之前的一个项目,我需要在图表控件上显示连续的数据流。
我决定开发自己的控件,因为我找不到任何可以提供所需灵活性的自由软件控件。
其中一个主要的限制是,控件必须绘制大量的数据,并能够迅速显示它(在Pocket PC上)。
控件能够通过仅绘制新的数据点而不是完整的数据序列来做到这一点并且图表还能够显示静态数据。
这种控件是我长时间工作的结果,而且费尽周折地为了提供足够的灵活性来供需要它的人使用。
对于使用者反馈我表示由衷的感谢:一个邮件,留言板中的一一句话或只是对本文评级。
当我不知道是否还有人使用它时,我就没有必要维护这个控件了。
免责声明这个控件是我花费很长时间的开发的结果,因此我对代码的使用放置一些小条件:该代码可以以编译的形式用于任何非商业和商业目的。
代码可以被重新开发,只要它提供作者名字和完整的免责声明。
更改源代码需要得到作者的同意。
此代码不提供任何安全保证。
我不会对使用此代码造成的损失负责。
使用它需要自己承担风险。
This code may be used for any non-commercialand commercial purposes in a compiled form.The code may be redistributed as long as it remainsunmodified and providing that the author nameand the disclaimer remain intact. The sourcescan be modified with the author consent only.This code is provided without any guarantees.I cannot be held responsible for the damage orthe loss of time it causes. Use it at your own risks.鉴于开发这个控件所付出的努力,下面的要求并不过分:如果你在在商业应用程序中使用这个控件,那么请给我发邮件让我知道。
主要特点控件的主要特点是:高速绘图(轴固定时),允许快速绘制数据无限数量的数据序列(内存是限制)每个数据序列的数据量不受限制支持线图,点图,平面图,柱状图,K线图和甘特图系列最多四个轴(左,下,右和上轴)标准轴,对数轴或日期/时间轴自动伸缩的坐标轴, 翻转的坐标轴(相互独立)轴标签点标签平滑的曲线网格图例和标题交互性(在控件中发生特定事件时的通知)支持手动缩放和鼠标平移支持鼠标指针支持轴上的滚动条高度可定制(颜色,标题,标签,边缘,字体等)支持UNICODE支持打印和保存到图像文件文档结构本文通过一系列简短的教程来涵盖控件的大部分功能。
阅读本文后,您将能够快速地在自己的应用程序中使用本控件。
我决定从文章中删除所有的类和函数的文档,因为它不是非常友好并且我很难维护。
此外,随着代码的增长,要记录的类和函数的列表变得过于广泛以至于不能将所有内容放在文章中。
作为替代,我提供了一个doxygen文档,您可以从本文中(文章的开头)下载:只需下载“Doxygen文档”zip文件,解压所有文件,双击“Index.html”文件,进行查看。
入门学习此图表控件允许您在屏幕上绘制一系列数据。
此控件可以添加几个不同类型数据序列并且最多可以使用四个轴。
添加到图表的数据序列与一个水平轴(底部或顶部)和一个垂直轴(右侧或左侧)相关联。
这两个轴控制数据序列在图表上的显示方式。
为了能够在应用程序中使用次图表控件,您首先需要在自己的工程里添加源代码zip中包含的文件。
注意:控件在内部使用动态转型,因此必须启用RTTI(RunTime Type Information 运行时自动类型识别的机制),否则可能会发生崩溃。
默认情况下,VC6没有启用RTTI,因此要启用它打开项目设置- >“C / C ++”选项卡- >“C ++语言”类别,并确保“Enable Run-Time Type Information (RTTI) “选项已选中。
在应用程序中使用图表控件有两种方法:手动插入,或通过资源编辑器插入。
手动插入1.#include "ChartCtrl"添加在对话框(Dialog)类的头文件中2.在对话框类中添加变量CChartCtrl://{{AFX_DATA(CChartDemoDlg)//}}AFX_DATACChartCtrl m_ChartCtrl;3.在对话框类的OnInitDialog方法中添加这个控件的Create方法。
使用资源管理器1.向对话框资源添加自定义控件,打开控件的属性,并为Class属性指定ChartCtrl。
为了避免滚动条上的闪烁,必须设置WS_CLIPCHILDREN样式(0x02000000L),如图所示。
2.#include "ChartCtrl.h"添加在对话框(Dialog)类的头文件中3.在对话框类中添加变量CChartCtrl://{{AFX_DATA(CChartDemoDlg)//}}AFX_DATACChartCtrl m_ChartCtrl;4.在DoDataExchange函数中添加DDX_Control(不要忘了更改ID号和控件名字):Add a variable of type CChartCtrl in your dialog class:Hide Copy Code//{{AFX_DATA(CChartDemoDlg)//}}AFX_DATA操作数据序列几种类型的数据序列可以添加到控制:点序列,线序列,曲面序列,柱状图序列,K 线图序列或甘特图序列。
点的数据格式可能因序列而异(例如,K线图和甘特图系列使用不同的点格式)。
一旦你选择了一种系列,你可以通过调用上表中列出的CChartCtrl类的辅助函数之一将其添加到图表中。
这些函数接受两个可选参数:两个布尔值来确定描述该系列是连接到副水平轴(顶轴)或者是连接大副垂直轴(右轴)。
如果未指定参数,则数据系列将附加到主水平轴(底部轴)和主垂直轴(左轴)。
警告: 在将任何系列添加到图表之前,您需要创建该系列所连接的两个轴。
如果不这样做,将导致控件失效(assert)。
有关详细信息,请参见“操纵轴”一节。
一旦将系列添加到图表后,我们就可以使用数据填充该图表。
有两种方法:将数据放到一个单元中一起添加,或者逐点添加。
后者用于有动态数据时:每次调用函数时都会更新图表。
虽然这个调用是快速的(在某些特定条件下),但是最好尽可能地将数据放到一个单元中。
下面是一个简单代码示例,它在图表中创建两个系列,并用数据填充它们:一个系列在初始化时完全填充,另一个系列在调用OnDataReceived函数(仅存在于此示例的目的)时填充。
m_pLineSeries,m_pPointsSeries和m_ChartCtrl是CMyClass类的成员变量。
void CMyClass::Init(){.... // SNIP: Creation of the axes in the chart. This MUST be done before.m_pLineSeries = m_ChartCtrl.CreateLineSerie();m_pPointsSeries = m_ChartCtrl.CreatePointsSerie();double YValues[10];for (inti=0;i<10;i++)XValues[i] = YValues[i] = i;m_pLineSerie->SetPoints(XValues,YValues,10);}void CMyClass::OnDataReceived(double X, double Y){m_pPointsSeries->AddPoint(X, Y);}所有系列类继承自同一抽象基类:CChartSerie。
该类处理所有系列通用的功能,但对具体的数据点没有任何处理功能。
点的概念在子类CChartSerieBase中引入,它是一个模板类,模板参数是要操作为点的数据类型。
这很重要,因为序列可能必须处理不同的数据类型:例如点序列操作具有X和Y值的点,但是K线图系列操纵具有5个值(打开,关闭,高,低和时间值)的点。
其他系列继承自CChartSerieBase并提供他们操作的数据类型。
CChartSerieBase类已经处理了大多数数据管理,并通过纯虚函数将渲染委托给子类。
每个系列在创建时也会分配一个Id。
此标识可通过CChartSerie :: GetSerieId()检索,并可用于从图表中删除该系列。
该系列的一个重要特征是控制点的顺序:该系列中的所有点将根据它们的值重新排序。
默认情况下,点是基于它们的X值排序的,但您可以通过对它们的Y值排序或不对它们进行排序来改变这种行为(在这种情况下,系列保持将点添加到系列中的顺序)。
对点进行排序会对性能产生影响:如果点是有序的,则控件能够从完整系列中检索第一个和最后一个可见点,并且仅绘制两个点之间的点。
另一方面,你将不能绘制像椭圆形的曲线。
您可以通过调用CChartSerieBase :: SetSeriesOrdering来更改点的顺序。
控件中的不同系列的功能通常是不言自明的。
然而,柱状图系列需要一些解释。
柱状图系列这个系列有点特别,如果其中几个在同一个控件上绘制在一起,他们将互相影响。
目的是能够绘制多个条形图系列,而不会重叠:它们是彼此相邻绘制的。
为此,您需要指定每个所属的组(一个简单的整数标识符)。
同一组的系列彼此相邻地绘制(或者对于水平条在彼此的顶部):参见两个图形的示例。
设置组ID是通过SetGroupId函数完成的。
您还可以通过调用SetInterSpace静态函数来控制所有柱形图之间剩余的空间的宽度。
这将为所有系列设置以像素为单位的空间(因此,如果显示多于两个系列,则在任何位置使用相同的空间)。
注意,您可以通过调用SetBarWidth单独设置柱状图系列的宽度。
在点上添加标签一旦使用数据填充您的系列,您还可以在系列的特定点上添加标签:这个标签始终附加到特定点。
现在,只提供一种类型的标签,气泡标签:包含文本的圆角矩形并用线连接到特定点上。
当然,如果需要,您也可以提供自己的自定义标签(参见“扩展功能”一节)。
有两种方式创建文本标签:静态创建标签时,或动态注册一个对象,当标签请求时,它将提供文本。
第一种方法是最简单的,但也不太灵活。