admin 管理员组文章数量: 887021
2024年3月8日发(作者:wpf自定义按钮样式)
MSChart
MSChart的安装使用
最近需要为程序显示一些柱状图、线图之类的,查了一下微软的mschart不错,功能强大。可是自vc6.0之后mschart控件就从ms的IDE里去掉了,如果用只能自己下载安装。安装mschart需要
1 .net framewrok 3.5 sp1(注意是sp1),没有安装的话就去下载吧,完整包大概200多M
2 安装 MSChart_ 下载到C:WINDOWSsystem32目录下。命令行运行regsvr32
注册控件
3 在vs2005之后的平台上,你要么在class view下add class->MFC Class
from ActiveX Control然后有两个,你可以选择registy然后选择ms mschart
6.0(oled),这样只能出现一个类 CMSCHART,或者选择File然后浏览,这里面生成了很多类,你全部添加进去,最后就可以用了。
第二、你可以在一个MFC dialog上 insert axtivex control或者toolbox选择choose item->com选择组件让它出现在工具箱中,这样也可以有控件。
我们自己选择生成的很多类,跟网上有示例的类函数名称上有所不同,可能会给使用带来麻烦。其实最简单的就是找到一个Demo把里面相关的CMSCHART和其它相关的十几个类都拷贝到我的工程文件夹里,再添加进来,就ok了。
网上很多例子可供参考,比如:/document/viewdoc/?id=959
关于遇到的一些问题。在设置图形类型的时候,m_rtType(1|2);显示出2D曲线图,而我们用m_rtType(16);的时候如果你只设置了m_umnCount(1); 就不会显示,因为16的散列图需要的是一对坐标点,你至少需要设置m_umnCount(2);为2。
Mschart学习(MSchart介绍)
1.什么是MSChart
Chart: Microsoft Chart Controls for Microsoft .NET Framework 3.5
•
•
•
•
•
适用于.NET Framework 3.5 SP1 的和Windows Form图标控制项
开发商: 2007年Dundas 开发出收費的Chart控件 2008/9/8微软发布免費的MSChart控件
Support Service: system :win2003 sp2 ,win2008,windows vista,winxp
sp3 .net Framework: .NET Framework 3.5 SP1(VS2008)
处理器:400 MHz Pentium(最低);1GHz Pentium(建议) RAM:96 MB(最小)256MB(建议) Hard: 500MB可用磁盘空间
显卡: 800*600、256色(小) 1024*768、256色
t安装
•安装完成VS2008(.NET Framework 3.5 SP1)下载地址
•
•
1)
2)
3) MSChart_
4) MSChartLP_
• 安装顺序:
(1)
(2)MSChart_
(3)MSChartLP_
(4)
打开VS2008在工具中新增了Data Chart控件:
MSChart 图表类型
and Column Charts 3D or 2D Bar or Column Charts like this page:
•
Stacked charts Bar and Column 3D Bar and
Column
Charts
3. Range Charts
4. Circular charts
5. Accumulation charts
6. Area Chart
7. Pie and Doughnut charts
8. Point charts
9. Advanced Financial charts
10. Combinational Charts
t 属性介绍
这些属性在添加chart的时候会有。
开启VS2008 •新建网站ChartTest 打开工具列:
点击Chart在页面中添加Chart图形,在属性栏中选择 Chart类型
t inVS2008 实现
•查询数据结果对应到Chart的XY轴
1 1) string strSql = "SELECT Top 5 empid, COUNT(*) AS lNum FROM log
where empid <> '' GROUP BY empid ORDER BY empid";
2 DataSet ds = eDataset(strConnISPD,
, strSql);
3 DataView dv = new DataView([0]);
4 ["login"].ndXY(dv, "empid", dv, "lNum");
5 2) SqlCommand cd = new SqlCommand(strSql, conn);
6 SqlDataAdapter da = new SqlDataAdapter();
7 Command = cd;
8 DataSet ds = new DataSet();
9 (ds, "log");
10 DataView dv = new DataView([0]);
11 ="empid";
12 ["login"].ndXY(dv, "empid", dv,
"lNum");
使用现有数组数据到Chart的XY轴
1 double[] yValues = {12, 67, 45, , 67, 89, 35, 12, 78, 54};
2 double[] xValues = {1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997,
1998, 1999};
3 ["Series1"].ndXY(xValues, yValues);
MSChart使用做折线图饼图
首先当然需要下载MSChart 下载地址 而且微软官方有个很不错的实例代码可以帮助学习使用MSChart 下载地址,当然不用我说.大家也知道的.需要NET
Framework 3.5以及配合VS2008 sp1来使用了,至于vs2010好像还没有发现MSChart ,希望有知道的朋友给点帮助.
安装完MSChart后 在vs2008报表一栏里会出现MSChart控件..二话不说 拖到页面.自动生成如下代码:
相信在你们看过微软的实例后对这些属性会有一些了解滴..
然后进入正题,本文也主要介绍 MSChart的 折线图,圆饼图,和柱状图, 因为这三种本人感觉是最常用的.
对于这三种用MSChart来实现的话本人感觉比较困难的就是数据绑定带来的麻烦,因为在我们平时使用的时候基本都是动态的数据,
而微软实例基本都是写死在页面上的数据, 而且网上这方面资料也比较少,只能自己动手实践啦.
先介绍几种MSChart的数据绑定方式,
第一种,也是最通俗的一种
urce = rtData();
["ChartArea1"].XValueMember = "home";
["ChartArea1"].YValueMembers = "num1";
第二种往后都是通过List的集合形式绑定数据,这里就用变量list来代替了.一些变量都是对应实体类的名称当然也对应数据库字段
ndTable(list, "home");
"home"是 x轴坐标
第三种,home 分组,Time X轴坐标,num1 y轴坐标
ndCrossTable(list, "home", "Time", "num1",
"Label=num1,ToolTip=num1");
第三种,折线图绑定方式
[0].nd(list, "home", "num1",
"Label=num1,ToolTip=num1");
第四种,折线图绑定方式
ndCrossTable(list, "home", "Time", "num1",
"Label=num1,ToolTip=num1");
//绘制线条
MarkerStyle marker = ;
foreach (Series ser in )
{
Offset = 1;
Width = 2;
ype = ;
Size = 12;
Style = marker;
BorderColor = gb(64, 64, 64);
= new Font("Trebuchet MS", 8, r);
marker++;
}
第五种:
["Series1"].ndXY(list, "home", list,
"num1");
我所了解的就这么几种了,有朋友知道有更好的绑定方式不妨贴上代码来.
下面介绍下MSChart下的柱形图
常用的属性这篇博客都有介绍,在这里我就不罗嗦了../wenjl520/archive/2009/05/16/
//是否启用3D显示
reas[0].3D = true;
//显示类型,可以是柱形 折线等等
[0].ChartType = ;
//// Draw as 3D Cylinder
[0]["DrawingStyle"] = "Cylinder";
//像素点见宽度
[0]["PointWidth"] = "0.8";
//是否显示数值
[0].IsValueShownAsLabel = true;
//X轴数据显示间隔
reas[0].al = 1;
//直角坐标显示,
reas[0].tAngleAxes = false;
//是否群集在一起
reas[0].tered = false;
//转动X轴角度
reas[0].ation = 40;
//转动Y轴角度
reas[0].on = 20;
foreach (Series ser in )
{
//柱形宽度
ser["PixelPointWidth"] = "40";
//像素点深度
ser["PixelPointDepth"] = "80";
//像素点间隙深度
ser["PixelPointGapDepth"] = "10";
}
这些属性都是设置MSChart的外观样式的属性,大家可以尝试修改试试,
当然主要的是绑定数据了.所以在调用这些属性时先用上文介绍的几种绑定方式绑定数据.
有些属性可能在3D模式下失效或者在2D模式下失效,这是正常现象,
效果图:
折线图:
属性同上..有些属性会在折线图下失效,
效果图:
圆饼图:
IList
//数值显示百分比形式
["Series1"].Label = "#PERCENT{P}";
["Series1"].nd(list, "home", "num1",
"LegendText=home,YValues=num1,ToolTip=num1");
["Series1"].ChartType =
;
["Series1"].ToolTip = "#LEGENDTEXT: #VAL{C}
million";
reas["ChartArea1"].3D = true;
这个比较简单吧..
主要是这里的 ["Series1"].nd(list, "home", "num1",
"LegendText=home,YValues=num1,ToolTip=num1");
LegendText整了我半天.这个是显示右侧说明的,开始老是显示不出来,而且还不统一.
Legend其实就是右侧显示的说明,但是做过的朋友会发现在柱形图还有折线图如果页面指定了一个
写上这么一段代码 ();
MSChart可不止可以制作这三种图形,我只是觉得这三种比较常用.想在圆饼图中合并几项成显示成其他,搞了半天没搞出来,郁闷,谁知道告诉下.
C#中使用MSChart
这两天在研究怎样在 C# 中使用MSChart组件来绘制柱状、饼状图形,由于以前没有接触过MSChart组件,关于这方面的资料也没有;于是就到网上狂搜一把,找到了一些相关的资料,但资料都写的不完整; 现在将自己摸索的心得整理一下:
1、将MSChart control的引用添加到工具栏。
选择“工具->选择工具箱项”, 然后切换到“COM 组件”页,选择“Microsoft Chart Control 6.0 (OLEBD)”,点击确定后就可以成功加载控件了。
2、添加引用,using MSChart20Lib;
3、定义图表样式
//图表标题
ext = "年度统计图表";
//页底说明
= "说明:年度柱状统计图表";
//设置图例
gend = true;
onType = cationTypeRight;
//设置Plot的Shadow
= owStyleDrop;
//设置Shadow的大小
(60, 60);
//设置Plot的边框
= eStyleSingleLine;
//关闭选择
elections = false;
4、显示数据
nt = 12;
Label = "温度";
// Y轴名称
_Axis(isIdY, 0). = "温度";
// X轴名称
_Axis(isIdX, 0). = "月份";
for(int row = 1; row <= 12; ++row)
{
= (short)row;
el = ng(row);
a((short)row, 1, 12*row, 0);
}
h();
基本可以满足一般需求了,需要完善的有-显示百分比数值。
使用MSChart实时动态显示折线图
分类: c#2013-07-17 17:56 829人阅读 评论(2) 收藏 举报
先说一下怎么设置主要属性。
reas[0].tionedInside=true;//指滚动条位于图表区内还是图表区外
reas[0].d=true;
reas[0].on;//指当前(最右边)显示的是第几个点,可以设为当前一共的数据减去Size;
reas[0]. = 5;//视野范围内共有多少个数据点
可以用一个list或者Arraylist记录数据,再用一个timer更新数据就可以了,记得刚进入timer要[0].();
其他的颜色什么的自己设置就可以了
分类: mvc 技术类2011-05-18 12:02 361人阅读 评论(0) 收藏 举报
lesqlstring
vs2008 MSChart图表使用
时间: 2009-11-16 10:25来源: 未知
作者: admin
点击: 1662次我要投稿
高质量的空间,完美支持1.0/2.0/3.5/MVC等
介绍MSChart的常用属性和事件
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的数据源。
Legends:图例说明。
Palette:图表外观定义。
Series:最重要的属性,图表集合,就是最终看到的饼图、柱状图、线图、点图等构成的集合;可以将多种相互兼容的类型放在一个绘图区域内,形成复合图。
IsValueShownAsLabel:是否显示数据点标签,如果为true,在图表中显示每一个数据值
Label:数据点标签文本
LabelFormat:数据点标签文本格式
LabelAngle:标签字体角度
Name:图表名称
Points:数据点集合
XValueType:横坐标轴类型
YValueType:纵坐标轴类型
XValueMember:横坐标绑定的数据源(如果数据源为Table,则填写横坐标要显示的字段名称)
YValueMembers:纵坐标绑定的数据源(如果数据源为Table,则填写纵坐标要显示的字段名称,纵坐标可以有两个)
ChartArea:图表所属的绘图区域名称
ChartType:图表类型(柱形、饼形、线形、点形等)
Legend:图表使用的图例名称
Titles:标题集合。
width:MSChart的宽度。
height:MSChart的高度。
常用事件:
nd()
绑定数据点集合,如果要在一个MSChart控件的一个绘图区(ChartArea)内添加多个不同数据源的图表,就用这个主动绑定数据集合的方法。可以将表中指定字段的值绑定到指定的坐标轴上。
nd()
给整个MSChart绑定一个数据源,该MSChart中的图表全部可以使用该数据源作为统计来源。
示例:
private void BindGrid()
{
= 800;
= 600;
//作图区的显示属性设置
//reas["ChartArea1"].inVisible = false;
//reas["ChartArea1"].3D = false;
//背景色设置
reas["ChartArea1"].ShadowColor = arent;
reas["ChartArea1"].BackColor = gb(209, 237, 254); //该处设置为了由天蓝到白色的逐渐变化
reas["ChartArea1"].BackGradientStyle = tom;
reas["ChartArea1"].BackSecondaryColor = ;
//X,Y坐标线颜色和大小
reas["ChartArea1"].lor = gb(64, 64, 64, 64);
reas["ChartArea1"].lor = gb(64, 64, 64, 64);
reas["ChartArea1"].dth = 2;
reas["ChartArea1"].dth = 2;
reas["ChartArea1"]. = "时间";
reas["ChartArea1"]. = "灰量";
//中间X,Y线条的颜色设置
reas["ChartArea1"].lor = gb(64, 64, 64, 64);
reas["ChartArea1"].lor = gb(64, 64, 64, 64);
//X.Y轴数据显示间隔
reas["ChartArea1"].al = 1.0; //X轴数据显示间隔
reas["ChartArea1"].alType = ;
reas["ChartArea1"].alOffset = 0.0;
reas["ChartArea1"].alOffsetType = ;
reas["ChartArea1"]. = "M-d";
reas["ChartArea1"].al = 200;// y轴数据显示间隔
//X轴线条显示间隔
//reas["ChartArea1"].alType = ;
e = ;
string sql = "select sum(zhl) zhl, input_date, ash_type_name from (" +
" select sum(_load - _load) as zhl," +
" to_date(to_char(_date, 'dd/mm/yyyy')||'00:00','dd/mm/yyyy hh24:mi:ss') as input_date," +
" _type_name" +
" from transportation_bill t, ash_type u" +
" where _type_id = _type_id" +
" and (_date between to_date('2009-6-11','yyyy-mm-dd') and
to_date('2009-6-20','yyyy-mm-dd'))" +//此处加按日期查询的条件
" and _organization_id = 1" +//此处加用户所在机构查询条件
" group by _type_name, _date" +
" order by _date" +
")" +
" group by ash_type_name,input_date" +
" order by input_date";
DataTable dt2 = eDataTable(tionString,
, sql, "T", null);
ndCrossTable(tView, "ash_type_name", "input_date", "zhl", "",
ing);
foreach (Series sr in )
{
ype = ;
Type = ;
Style = ;//散点样式
Size = 5;//默认是5,散点大小
Step = 1;//默认是1,散点频率
Color = 1;//默认是透明,散点颜色
Width = 2;
}
//s["Default"].Docking = ;
}
使用详解
分类: c++2010-11-22 09:49 2924人阅读 评论(1) 收藏 举报
list
第一步:把(下载)和(搜索下系统里有)放在一起,比如D盘根目录下,执行注册控件“regsvr32 D:/”。
第二步:成功后,在VC++下“工程->增加到工程->Components and Controls”,打开了文件通用对话框,选择“Registered ActiveX Controls->Microsoft Chart Control, version 6.0 (OLEDB)”,控件插入后就可以开始使用了。
第三步:代码示例
1、先给控件赋予变量m_Chart
2、加入头文件(可以继续加,少什么加什么)
#include "mschart.h "
#include "vcplot.h "
#include "vcseriescollection.h "
#include "vcseries.h "
#include "vcdatapoints.h "
#include "vcdatapoint.h "
#include "vcdatapointlabel.h "
#include "vcfont.h "
#include "vcaxis.h "
#include "VcValueScale.h"
#include "VcBackdrop.h"
#include "VcFill.h"
#include "VcBrush.h"
#include "VcColor.h"
#include "VcPen.h"
#include "VcCategoryScale.h"
#include "VcAxisTitle.h"
#include "VcDataGrid.h"
3、初始化图表:
m_t().GetAxis(1,chart_var).GetValueScale().SetMajorDivision(100);//y轴刻度10等分
m_t().GetAxis(1,chart_var).GetValueScale().SetMinorDivision(0.1);//每刻度一个刻度线
m_umnCount(2); //2个项,2条曲线
m_leText("用户消费情况折线图统计");//设置标题栏
m_umnLabel("本地话费");//设置第j列标签
m_umn(2);
m_umnLabel("长途话费");
m_t().GetAxis(0,chart_var).GetAxisTitle().SetText("消费日期"); //X轴名称
m_wLegend(TRUE);
m_t().GetSeriesCollection().GetItem(1).GetPen().GetVtColor().Set(0, 0, 255);//线色,蓝色曲线
m_t().GetSeriesCollection().GetItem(1).GetPen().SetWidth(1);//线宽
m_t().GetSeriesCollection().GetItem(2).GetPen().GetVtColor().Set(255, 0, 0);//红色
m_t().GetSeriesCollection().GetItem(2).GetPen().SetWidth(1);//线宽
m_kdrop().GetFill().SetStyle(1);
m_kdrop().GetFill().GetBrush().GetFillColor().Set(255, 255, 255);//白色背景
//初始化曲线值
for(int beginrow=1; beginrow<=5; ++beginrow){
m_aGrid().SetData(beginrow, 1, 0, 0);//设置第一条曲线的第row个点
m_aGrid().SetData(beginrow, 2, 0, 0);//设置第二条曲线的第row个点
}
4、开始画图:
int items = m_list_mCount();
m_Count(items);
for (int j=0; j { m_aGrid().SetData(j+1, 1, data_local[j], 0);//设置第一条曲线的第j+1个点 m_aGrid().SetData(j+1, 2, data_long[j], 0);//设置第一条曲线的第j+1个点 m_(j+1); m_Label(data_time[j]);//设置第i行标签 } m_h(); 其中data_local和data_long为两条曲线采样点的整数值。datatime为字符串数组。 VS2010使用MSChart控件 分类: C & C++2013-09-28 20:05 358人阅读 评论(0) 收藏 举报 vs2010mfcMSChart 1、将放入system32中,并注册 2、添加ActiveX控件: Tools->choose toolbox items->COM components 选择Microsoft chart control 3、添加类 Project->Addclass ->MFC class from Typelib 选择 Microsoft chart control 。这时工程中会生成许多CVc开头的头文件。 4、使用时添加 [html] view plaincopy 1. 2. #import <> no_namespace #import <> no_namespace 引用相关头文件 [html] view plaincopy 1. 2. 3. 4. 5. 6. 7. 8. 9. #include "CVcPlot.h" #include "CVcAxis.h" #include "CVcValueScale.h" #include "CVcSeriesCollection.h" #include "CVcSeries.h" #include "CVcPen.h" #include "CVcCategoryScale.h" #include "CVcColor.h" #include "CVcDataGrid.h" 10. #include "CVcBackdrop.h" 11. #include "CVcFill.h" 12. #include "CVcBrush.h" 13. #include "CVcDataPoints.h" 14. #include "CVcDataPoint.h" 15. #include "CVcDataPointLabel.h" 16. #include "CVcAxisTitle.h" 17. #include "CVcAxisScale.h" 18. #include "CVcAxisGrid.h" 19. #include "CVcFont.h" 20. #include "CVcTitle.h" VC++6.0中使用MsChart总结 分类: VC++&MFC2013-01-03 12:55 1973人阅读 评论(4) 收藏 举报 目录(?)[-] 1. 2. 在工程中加入 mschart 添加头文件 3. 4. 5. 6. 7. 8. 9. 类中定义CMSChart 变量 创建m_Chart 初始化m_Chart 设置m_Chart数据 添ON_SIZE消息响应函数 改变显示类型 程序运行效果图 10. 11. MsChart函数说明 说明:本文将网上一些MSChart的使用方法进行了一个总结,按下面的步骤可以实现一个产生三条曲线(每条曲线6个随机数点)的表。 1 在工程中加入 mschart MSChart是VC++6.0中自带的一个特殊控件类,用于绘制坐标曲线图。首先建一个基于对话框的MFC程序,插入MsChart 控件,在工程中加入 mschart : 菜单->Project->AddToProject->ComponentsandControls->RegisteredActiveXControls>MicrosoftChartControl,version6.0(OLEDB) 2 添加头文件 在要使用的类的实现文件中包含如下头文件 第一部分: [html] view plaincopy 1. 2. 3. 4. 5. 6. 7. 8. 9. #include "VcPlot.h" #include "VcAxis.h" #include "VcValueScale.h" #include "VcSeriesCollection.h" #include "VcSeries.h" #include "VcPen.h" #include "VcCategoryScale.h" #include "VcColor.h" #include "VcDataGrid.h" 10. #include "VcBackdrop.h" 11. #include "VcFill.h" 12. #include "VcBrush.h" 13. #include "VcDataPoints.h" 14. #include "VcDataPoint.h" 15. #include "VcDataPointLabel.h" 16. #include "VcAxisTitle.h" 17. #include "math.h" 在要使用的类的头文件中包含: [cpp] view plaincopy 1. #include "mschart.h" 3 类中定义CMSChart 变量 [cpp] view plaincopy 1. 2. 3. 4. 5. 6. 7. 8. 9. class CMsChartDlgDlg : public CDialog { // Construction … … private: 10. 11. CMSChart m_Chart; //对话框关联的类中定义CMSChart类 12. 13. … … 14. 15. }; 4 创建m_Chart CMsChartDlgDlg::OnInitDialog()函数中添加如下代码 [cpp] view plaincopy 1. 2. 3. CRect rc; GetClientRect(&rc); += 30; 4. 5. 6. 7. 8. 9. += 50; -= 80; -= 50; m_("mschart", WS_CHILD| WS_VISIBLE, rc, this, 10); //控件资源初始化 10. initmschart(); 5 初始化m_Chart 在CMsChartDlgDlg中添加函数: void CMsChartDlgDlg::initmschart(); //初始化 [cpp] view plaincopy 1. 2. 3. 4. 5. 6. 7. 8. 9. //主要设置表的样式:表的XY轴长度色彩等等 void CMsChartDlgDlg::initmschart() { // 设置标题 m_leText("mschart 示例*****************"); 10. // 下面两句改变背景色 11. m_kdrop().GetFill().SetStyle(1); 12. m_kdrop().GetFill().GetBrush().GetFillColor().Set(255, 255, 255); 13. 14. // 显示图例 15. 16. m_wLegend(TRUE); 17. m_umn(1); 18. m_umnLabel((LPCTSTR)"1号机"); 19. m_umn(2); 20. m_umnLabel((LPCTSTR)"2号机"); 21. m_umn(3); 22. m_umnLabel((LPCTSTR)"3号机"); 23. 24. // 栈模式 25. //m_cking(TRUE); 26. 27. // Y轴设置 28. VARIANT var; 29. m_t().GetAxis(1,var).GetValueScale().SetAuto(FALSE); // 不自动标注Y轴刻度 30. m_t().GetAxis(1,var).GetValueScale().SetMaximum(100); // Y轴最大刻度 31. m_t().GetAxis(1,var).GetValueScale().SetMinimum(0); // Y轴最小刻度 32. m_t().GetAxis(1,var).GetValueScale().SetMajorDivision(5); // Y轴刻度5等分 33. m_t().GetAxis(1,var).GetValueScale().SetMinorDivision(1); // 每刻度一个刻度线 34. m_t().GetAxis(1,var).GetAxisTitle().SetText("小时"); // Y轴名称 35. 36. // 3条曲线 37. m_umnCount(3); 38. 39. // 线色 40. m_t().GetSeriesCollection().GetItem(1).GetPen().GetVtColor().Set(0, 0, 255); 41. m_t().GetSeriesCollection().GetItem(2).GetPen().GetVtColor().Set(255, 0, 0); 42. m_t().GetSeriesCollection().GetItem(3).GetPen().GetVtColor().Set(0, 255, 0); 43. 44. // 线宽(对点线图有效) 45. m_t().GetSeriesCollection().GetItem(1).GetPen().SetWidth(50); 46. m_t().GetSeriesCollection().GetItem(2).GetPen().SetWidth(100); 47. m_t().GetSeriesCollection().GetItem(3).GetPen().SetWidth(2); 48. 49. // 数据点类型显示数据值的模式(对柱柱状图和点线图有效) 50. // 0: 不显示 1: 显示在柱状图外 51. // 2: 显示在柱状图内上方 3: 显示在柱状图内中间 4: 显示在柱状图内下方 52. m_t().GetSeriesCollection().GetItem(1).GetDataPoints().GetItem(-1).GetDataPointLabel().SetLocationType(1); 53. m_t().GetSeriesCollection().GetItem(2).GetDataPoints().GetItem(-1).GetDataPointLabel().SetLocationType(1); 54. m_t().GetSeriesCollection().GetItem(3).GetDataPoints().GetItem(-1).GetDataPointLabel().SetLocationType(1); 55. 56. } 6 设置m_Chart数据 [cpp] view plaincopy 1. 2. 3. 4. 5. 6. //画曲线 void CMsChartDlgDlg::DrawChart() { 7. 8. 9. int nRowCount = 6; m_Count(nRowCount); 10. VARIANT var; 11. // 不自动标注X轴刻度 12. m_t().GetAxis(0,var).GetCategoryScale().SetAuto(FALSE); 13. // 每刻度一个标注 14. m_t().GetAxis(0,var).GetCategoryScale().SetDivisionsPerLabel(1); 15. // 每刻度一个刻度线 16. m_t().GetAxis(0,var).GetCategoryScale().SetDivisionsPerTick(1); 17. 18. // X轴名称 19. m_t().GetAxis(0,var).GetAxisTitle().SetText("日期"); 20. char buf[32]; 21. srand( (unsigned)time( NULL ) ); 22. 23. //随机产生三条曲线的6个点 24. for(int row = 1; row <= nRowCount; ++row) 25. { 26. m_(row); 27. sprintf(buf, "%d号", row); 28. m_Label((LPCTSTR)buf); 29. m_aGrid().SetData(row, 1, rand() * 100 / RAND_MAX, 0);//设置第一条曲线的第row个点 30. m_aGrid().SetData(row, 2, rand() * 100 / RAND_MAX, 0);//设置第二条曲线的第row个点 31. m_aGrid().SetData(row, 3, rand() * 100 / RAND_MAX, 0);//设置第三条曲线的第row个点 32. } 33. 34. m_h(); 35. 36. } 7 添ON_SIZE消息响应函数 在 CMsChartDlgDlg::OnSize 中调整 m_Chart 的大小,使之能随窗口大小变化而变化 [cpp] view plaincopy 1. 2. 3. //添加ON_SIZE消息响应函数 void CMsChartDlgDlg::OnSize(UINT nType, int cx, int cy) 4. 5. 6. 7. 8. 9. { CDialog::OnSize(nType, cx, cy); if( m_eHwnd() ) m_ndow( 0, 0, cx, cy ); 10. // TODO: Add your message handler code here 11. 12. } 8 改变显示类型 [cpp] view plaincopy 1. 2. 3. 4. 5. 6. 7. 8. 9. // 折线图 void CDemoView::OnChartLine() { m_rtType(3); DrawChart(); } // 柱状图 10. void CDemoView::OnChartCombi() 11. { 12. m_rtType(1); 13. DrawChart(); 14. } 15. // 饼状图 16. void CDemoView::OnChartPie() 17. { 18. m_rtType(14); 19. DrawChart(); 20. } 9 程序运行效果图 10 MsChart函数说明: [cpp] view plaincopy 1. 2. 3. 4. 5. 6. 7. 8. 9. 1. m_t().GetAxis(1,var)//获取纵轴 2. //设置是否支持自动标准;控件默认支持自动标准。 3. m_t().GetAxis().GetValuesScale().SetAuto(FALSE); 4. //设置最大刻度为M; 5. m_t().GetAxis().GetValuesScale().SetMaximum(M); 10. 11. 6. //设置最小刻度为m; 12. 13. 7. m_t().GetAxis().GetValuesScale().SetMinimum(m); 14. 15. 8. //设置轴的等分数D; 16. 17. 9. m_t().GetAxis().GetValuesScale().SetMajorDivision(D); 18. 19. 10. //设置每等分的刻度线数n; 20. 21. 11. m_t().GetAxis().GetValuesScale().SetMinorDivision(n); 22. 23. 12. //b)横轴初始化属性 24. 25. 13. VARIANT var; 26. 27. 14. m_t().GetAxis(0,var)//获取横轴 28. 29. 15. //其他属性设置跟纵轴相同。 30. 31. 16. //1.2 数据显示 32. 33. 17. //a)设置标题栏和标签 34. 35. 18. m_leText(“标题”);//设置标题栏 36. 37. 19. m_Label((“第I行”);//设置第i行标签 38. 39. 20. m_umnLabel((“第j列”);//设置第j列标签 40. 41. 21. //b)行列的显示布局 42. 43. 22. // MSChart的行列显示布局有其自身的特点:下面显示是一个行列4×3(矩形图),即(四行,三列)的布局示意图。 44. 45. 23. m_Count(4); //没条曲线三个四个点 (曲线图) 46. 47. 24. m_umnCount(3); //设置曲线条数为三条(曲线图) 48. 49. 25. //c)行列操作 50. 51. 26. // 操作行列第i行、第j列 52. 53. 27. m_(i);// 第i行 54. 55. 28. m_umn(j);//第j列 56. 57. 29. m_Label((“第i行”);//设置第i行标签 58. 59. 30. CString str=”90.5”; 60. 61. 31. m_a((LPCTSTR(str)); //设置行列,j>的显示数据 62. 63. 32. m_h();//刷新视图 64. 65. 33. //d)显示方式 66. 67. 34. //获取当前的显示方式: 68. 69. 35. long nType =m_rtType(); 70. 71. 36. //设置显示方式: 72. 73. 37. m_rtType(0);//3D(三维) 显示 74. 75. 38. m_rtType(1);//2D(二维) 显示 76. 77. 39. m_h(); 78. 79. 40. //其它常用组合方式为: 80. 81. 41. m_rtType(1|0) //2D柱(条)形, 82. 83. 42. m_rtType(0|0) //3D柱(条)形 84. 85. 43. m_rtType(1|2) //2D线条型 86. 87. 44. m_rtType(0|2) //3D线条型 88. 89. 45. m_rtType(1|4) //2D区域型 90. 91. 46. m_rtType(0|4) //3D区域型 92. 93. 47. m_rtType(1|6) //2D阶梯型 94. 95. 48. m_rtType(0|6) //3D阶梯型 96. 97. 49. m_rtType(1|8) //2D复(混)合型 98. 99. 50. m_rtType(0|8) //3D复(混)合型 100. 101. 51. //另外,在2D方式中,还有两类:饼型和XY型 102. 103. 52. m_rtType(14) //2D 饼型 104. 105. 53. m_rtType(16) //2DXY型 106. 107. 54. //e)其他 108. 109. 55. //其他属性,比如设置字体,颜色,对齐方式等。 参考文章:/s/blog_ //wv/711 VC++6.0中MsChart控件的用法 分类: Windows编程2007-11-23 23:14 7832人阅读 评论(17) 收藏 举报 目录(?)[-] MSChart制图类 添加MSChart控件 MSChart控件的使用方法 类中变量定义 类中MSChart的初始化函数 添加ON_SIZE消息响应函数 CDrawImp的OnInitDialog函数种创建MSChart 1. MSChart制图类 1.1 添加MSChart控件 MSChart是VC++6.0中自带的一个特殊控件类,用于绘制坐标曲线图。如果要使用这个控件,则可以按下图的示意进行添加此控件。 1.2MSChart控件的使用方法 首先在要使用的类的实现文件中包含如下头文件: #include "VcPlot.h" #include "VcAxis.h" #include "VcValueScale.h" #include "VcSeriesCollection.h" #include "VcSeries.h" #include "VcPen.h" #include "VcCategoryScale.h" #include "VcColor.h" #include "VcDataGrid.h" #include "VcBackdrop.h" #include "VcFill.h" #include "VcBrush.h" #include "VcDataPoints.h" #include "VcDataPoint.h" #include "VcDataPointLabel.h" #include "VcAxisTitle.h" #include "math.h" 在要使用的类的头文件中包含: #include "mschart.h" 本系统中按照如下函数调用来实现MSChart类绘制故障树重要度曲线的功能(CDrawImp是调用MSChart的类)。 1.2.1 类中变量定义 class CDrawImp : public CDialog { // Construction public: void DrawChart(int type); void initmschart(); CMSChart m_Chart; …… } 1.2.2 类中MSChart的初始化函数 void CDrawImp::initmschart() { // 下面两句改变背景色 m_kdrop().GetFill().SetStyle(1); // 显示图例 m_wLegend(FALSE); m_umn(1); m_rtType(3); // 栈模式 m_cking(FALSE); // Y轴设置 VARIANT var; //不自动标注Y轴刻度 m_t().GetAxis(1,var).GetValueScale().SetAuto(FALSE); //Y轴刻度10等分 m_t().GetAxis(1,var).GetValueScale().SetMajorDivision(10); //每刻度一个刻度线 m_t().GetAxis(1,var).GetValueScale().SetMinorDivision(1); //不自动标注X轴刻度 m_t().GetAxis(0,var).GetCategoryScale().SetAuto(FALSE); //每刻度一个标注 m_t().GetAxis(0,var).GetCategoryScale().SetDivisionsPerLabel(0); //每刻度一个刻度线 m_t().GetAxis(0,var).GetCategoryScale().SetDivisionsPerTick(1); m_t().GetAxis(0,var).GetAxisTitle().SetText("基本故障事件(对应表2中的序号)");// X轴名称 // 1条曲线 m_umnCount(1); // 数据点类型显示数据值的模式(对柱柱状图和点线图有效) // 0: 不显示 1: 显示在柱状图外 // 2: 显示在柱状图内上方 3: 显示在柱状图内中间 4: 显示在柱状图// 内下方 m_t().GetSeriesCollection().GetItem(1).GetDataPoints().GetItem(-1).GetDataPointLabel().SetLocationType(0); } void CDrawImp::DrawChart(int type) { int nRowCount =nt(); VARIANT var; m_Count(nRowCount); m_t().GetSeriesCollection().GetItem(1).GetPen().GetVtColor().Set(0, 0, 255); char buf[32]; /* double max = 0.0; double min = 10.0; double temp; for (int i=0; i { switch(type) { case 0: temp (dex(i)).FactCF; break; case 1: temp (dex(i)).cfimportance; break; case 2: temp =(dex(i)).structimportance; break; case 3: temp = (dex(i)).edgeimportance; break; default: break; } if (max < temp) max = temp; if (min > temp) min = temp; }*/ m_t().GetAxis(1,var).GetValueScale().SetMaximum(10); = = // Y轴最大刻度 m_t().GetAxis(1,var).GetValueScale().SetMinimum(0); // Y轴最小刻度 double c; for(int row = 1; row <= nRowCount; ++row) { m_(row); sprintf(buf, "%d", row); m_Label((LPCTSTR)buf); switch(type) { case 0: c =(dex(row-1)).FactCF; m_t().GetSeriesCollection().GetItem(1).GetPen().GetVtColor().Set(0, 0, 255); // Y轴名称 m_t().GetAxis(1,var).GetAxisTitle().SetText("基本事件概率(-lg)"); break; case 1: c = (dex(row-1)).cfimportance; m_t().GetSeriesCollection().GetItem(1).GetPen().G etVtColor().Set(255, 0, 0); // Y轴名称 m_t().GetAxis(1,var).GetAxisTitle().SetText("概率重要度(-lg)"); break; case 2: c = (dex(row-1)).structimportance; m_t().GetSeriesCollection().GetItem(1).GetPen().GetVtColor().Set(0, 255, 0); //Y轴名称 m_t().GetAxis(1,var).GetAxisTitle().SetText("结构重要度"); break; case 3: c = (dex(row-1)).edgeimportance; m_t().GetSeriesCollection().GetItem(1).GetPen().GetVtColor().Set(255, 0, 255); // Y轴名称 m_t().GetAxis(1,var).GetAxisTitle().SetText("临界重要度(-lg)"); break; default: break; } m_aGrid().SetData(row, 1, -log10(c), 0); } m_h(); } 1.1.2.3 添加ON_SIZE消息响应函数 void CDrawImp::OnSize(UINT nType, int cx, int cy) { CDialog::OnSize(nType, cx, cy); if( m_eHwnd() ) m_ndow( 0, 0, cx, cy ); } 1.1.2.4 CDrawImp的OnInitDialog函数种创建MSChart BOOL CDrawImp::OnInitDialog() { CDialog::OnInitDialog(); m_radio = 0; m_Sel(0); UpdateData(FALSE); CRect rc; GetClientRect(&rc); += 80; -= 15; += 15; -= 15; m_("mschart", WS_CHILD| WS_VISIBLE, rc, this, 10); initmschart(); DrawChart(0); CString s; ("顶事件发生概率为: %f",topcf); GetDlgItem(IDC_TOPCFSTATIC)->SetWindowText(s); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } VC如何自动注册控件 (2011-06-17 18:53:42) 转载▼ 标签: 分类: 关于VC 杂谈 控件是重要的绘制图表的ActiveX控件,在VC得到广泛的运用。但是,此控件不是Windows系统默认注册的,如果不经过注册,采用此控件的程序将无法运行。故我们开发的程序,必须要检测运行此程序的电脑是否已注册控件,如果没有注册,程序必须能够自动注册此控件。 下面是自动注册的代码,没时间解释,见谅。 //=================================================================================== // //检测是否已注册控件 //如何没有,将存放在当前目录下的控件复制到系统目录下的System32,调用OnRegisterReg()函数注册 // //=================================================================================== LRESULT CConfigDlg::OnShowChart(WPARAM wparam,LPARAM lparam) { if(!OnIsRegistOCX()) { TCHAR Path[MAX_PATH+1]; //CSIDL_SYSTEM:GetSystemDirectory(); CSIDL_WINDOWS:GetWindowsDirectory() HRESULT hr= SHGetSpecialFolderPath(NULL, Path, CSIDL_SYSTEM, FALSE); CString url = Path; ::CopyFileA(strCurrentDir + "", url + "",true); OnRegisterReg(); } CChartDlg *pDlg = new CChartDlg; pDlg->DoModal(); return 1; } //=================================================================================== // //注册控件 // //=================================================================================== boolCConfigDlg::OnRegisterReg(void) { LPCTSTR pszDllName= " "; //装载ActiveX控件 HINSTANCE hLib = LoadLibrary(pszDllName); if (hLib < (HINSTANCE)HINSTANCE_ERROR) { MessageBox( " file could not be loaded! ", "Result ",MB_OK); return 0; } //获取注册函数DllRegisterServer地址 FARPROC lpDllEntryPoint; lpDllEntryPoint = GetProcAddress(hLib,_T("DllRegisterServer")); //调用注册函数DllRegisterServer if(lpDllEntryPoint!=NULL) { if(FAILED((*lpDllEntryPoint)())) { MessageBox( "Call to DllRegisterServer failed!", "Result ",MB_OK); FreeLibrary(hLib); return 1; }; // MessageBox( "注册成功", "结果",MB_OK); } else MessageBox( "Failed to regist ! " , "Result ",MB_OK); } //手动注销OCX控件Regsvr32 /u //=================================================================================== // //检测是否已注册控件,控件的CLSID:A2B370C-BA0A-11D1-B137-0000F8753F5D // //=================================================================================== boolCConfigDlg::OnIsRegistOCX(void) { HKEY hKey; BOOL bPresent; TCHAR szPath[_MAX_PATH]; DWORD dwRegType; DWORD cbData = sizeof szPath * sizeof TCHAR; hKey = NULL; bPresent = FALSE; ::RegOpenKey(HKEY_CLASSES_ROOT, _T("CLSID{3A2B370C-BA0A-11D1-B137-0000F8753F5D}InprocServer32"), &hKey); if(hKey) { HANDLE hfile; szPath[0] = 0; ::RegQueryValueEx(hKey, NULL, NULL, &dwRegType, (LPBYTE)szPath, &cbData); ::RegCloseKey(hKey); hfile = ::CreateFile(szPath, 0, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL); if(INVALID_HANDLE_VALUE != hfile) { bPresent = TRUE; ::CloseHandle(hfile); } } return bPresent; } 代码1 // : implementation of the CDemoView class // #include "stdafx.h" #include "Demo.h" #include "DemoDoc.h" #include "DemoView.h" #include "VcPlot.h" #include "VcAxis.h" #include "VcValueScale.h" #include "VcSeriesCollection.h" #include "VcSeries.h" #include "VcPen.h" #include "VcCategoryScale.h" #include "VcColor.h" #include "VcDataGrid.h" #include "VcBackdrop.h" #include "VcFill.h" #include "VcBrush.h" #include "VcDataPoints.h" #include "VcDataPoint.h" #include "VcDataPointLabel.h" #include "VcAxisTitle.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CDemoView IMPLEMENT_DYNCREATE(CDemoView, CView) BEGIN_MESSAGE_MAP(CDemoView, CView) //{{AFX_MSG_MAP(CDemoView) ON_WM_CREATE() ON_WM_SIZE() ON_COMMAND(ID_CHART_LINE, OnChartLine) ON_COMMAND(ID_CHART_COMBI, OnChartCombi) ON_COMMAND(ID_CHART_PIE, OnChartPie) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CDemoView construction/destruction CDemoView::CDemoView() { } CDemoView::~CDemoView() { } BOOL CDemoView::PreCreateWindow(CREATESTRUCT& cs) { } // TODO: add construction code here // TODO: Modify the Window class or styles here by modifying // the CREATESTRUCT cs return CView::PreCreateWindow(cs); ///////////////////////////////////////////////////////////////////////////// // CDemoView drawing void CDemoView::OnDraw(CDC* pDC) { } ///////////////////////////////////////////////////////////////////////////// // CDemoView diagnostics #ifdef _DEBUG void CDemoView::AssertValid() const { } void CDemoView::Dump(CDumpContext& dc) const { CView::Dump(dc); CDemoDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // TODO: add draw code for native data here CView::AssertValid(); } CDemoDoc* CDemoView::GetDocument() // non-debug version is inline { } #endif //_DEBUG ///////////////////////////////////////////////////////////////////////////// // CDemoView message handlers int CDemoView::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CView::OnCreate(lpCreateStruct) == -1) CRect rc; GetClientRect(&rc); if(!m_("mschart", WS_CHILD| WS_VISIBLE, rc, this, 10)) InitChart(); ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CDemoDoc))); return (CDemoDoc*)m_pDocument; return -1; return -1;
版权声明:本文标题:MSChart vc图表工具 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.freenas.com.cn/jishu/1709897888h549746.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论