zoukankan      html  css  js  c++  java
  • 学习图表控件MsChart

       控件:Microsoft .NET Framework 3.5 的 Microsoft 图表控件(Microsoft Chart Controls for Microsoft .NET Framework 3.5)–

    包含英文版,中文版。上面提供的链接是中文版的,可以更改为英文版。

    语言包:Microsoft Chart Controls for Microsoft .NET Framework 3.5 Language Pack 

    Microsoft .NET Framework 3.5 的Microsoft 图表控件 的语言包,包含23中语言。

    Microsoft Chart Controls Add-on for Microsoft Visual Studio 2008

    这个只有英文的,没找到中文的。

    文档 (Microsoft Chart Controls for .NET Framework Documentation) 

    这个只有英文的,没找到中文的。

    WinForm 和 Asp.net的例子(Samples Environment for Microsoft Chart Controls) – 

    这个只有英文的,没找到英文的。

    Demo 下载:http://code.msdn.microsoft.com/mschart

      下了它的示例程序后,运行了一下,非常的强大,可以支持各种各样的图形显示,常见的:点状图、饼图、柱状图、曲线图、面积图、排列图等等,同时也支持3D样式的图表显示,不过我觉得最有用的功能还是支持图形上各个点的属性操作,它可以定义图形上各个点、标签、图形的提示信息(Tooltip)以及超级链接、Javascript动作等,而不是像其它图形类库仅生成一幅图片而已,通过这些,加上微软自己的Ajax框架,可以建立一个可以互动的图形统计报表了。

    一。安装
        控件的安装相对比较简单,下载完后,先执行“MSChart.exe”程序,它会自动检测你的环境,安装到系统目录中去,如果要在VS 2008环境中直接使用,那么需要安装For Vs2008的插件,MSChart_VisualStudioAddOn.exe,还有一个中文语言包MSChartLP_chs.exe。安装完后,打开Vs2008,在建立项目的时候,你就能在工具栏中看到有一个Chart的控件了,

    二。使用
        安装好后,建立一个.NET3.5的Web项目,像使用普通控件一样拖放到要使用的Web界面即可。初步研究了一下,整个图形控件主要由以下几个部份组成:

    1.Annotations --图形注解集合

    2.ChartAreas  --图表区域集合

    3.Legends      --图例集合

    4.Series    --图表序列集合(即图表数据对象集合)

    5.Titles    --图标的标题集合

    Annotations注解集合

        Annotations是一个对图形的一些注解对象的集合,所谓注解对象,类似于对某个点的详细或者批注的说明,比如,在图片上实现各个节点的关键信息。

      一个图形上可以拥有多个注解对象,可以添加十多种图形样式的注解对象,包括常见的箭头、云朵、矩行、图片等等注解符号,通过各个注解对象的属性,可以方便的设置注解对象的放置位置、呈现的颜色、大小、文字内容样式等常见的属性。

    ChartAreas图表区域集合

        ChartAreas可以理解为是一个图表的绘图区,例如,你想在一幅图上呈现两个不同属性的内容,一个是用户流量,另一个则是系统资源占用情况,那么你要在一个图形上绘制这两种情况,明显是不合理的,对于这种情况,可以建立两个ChartArea,一个用于呈现用户流量,另一个则用于呈现系统资源的占用情况。

        当然了,图表控件并不限制你添加多少个绘图区域,你可以根据你的需要进行添加。对于每一个绘图区域,你可以设置各自的属性,如:X,Y轴属性、背景等。

        需要注意的是,绘图区域只是一个可以作图的区域范围,它本身并不包含要作图形的各种属性数据。

    Legends图例集合

        Legends是一个图例的集合,即标注图形中各个线条或颜色的含义,同样,一个图片也可以包含多个图例说明,比如像上面说的多个图表区域的方式,则可以建立多个图例,每别说明各个绘图区域的信息,具体的图例配置说明此处就不详细说明了,可以参考一下官网的例子,写得丰富的详细了:)

    Series图表序列

        图表序列,应该是整个绘图中最关键的内容了,通俗点说,即是实际的绘图数据区域,实际呈现的图形形状,就是由此集合中的每一个图表来构成的,可以往集合里面添加多个图表,每一个图表可以有自己的绘制形状、样式、独立的数据等。

        需要注意的是,每一个图表,你可以指定它的绘制区域(见ChartAreas的说明),让此图表呈现在某个绘图区域,也可以让几个图表在同一个绘图区域叠加

         继续回到ChartAreas章节举的例子,同时要显示用户的流量还要显示系统的占用情况,对于这种时候,应该建立两个Series,一个用于呈现用户的流量,另一个则用于呈现系统的占用情况。它们分别属于各自的绘图区域。


    Titles标题合集

        根据字面含义即可以理解,是图表的标题配置,同样可以添加多个标题,以及设置标题的样式及文字、位置等属性。多看一下它的属性即能明白各自的含义。

    三。其它属性

        相对来说,我觉得比较有用的属性有三个,分别是:Label、Tooltip以及Url链接。

        Label即标签的含义,可以在图片的关键位置进行一些关键数字或文字的描述

       X轴和Y轴的文字便是标签,以及图表曲线中的红点上的文字,也是标签,添加了标签,可以让人更容易的对内容进行理解。

        Tooltip即提示的含义,用于在各个关键点,如:标签、图形关键点、标题等当鼠标移动上去的时候,提示用户一些相关的详细或说明信息,例如上图,可以给曲线中的每一个点增加Tooltip的属性,写上需要详细说明的内容,比如:详细的销售明细,那么,在鼠标移动到这个点的时候,会自动弹出提示信息。

        Tooltip可以支持简单方式以及自定义的方式,简单方式即像平时Html页面设置的title之类的属性效果,而自定义的方式,则可以实现图形、文本等各种复杂的提示信息显示。详细的方式请参考官方例子的:Interactivity and AJAX/Tooltips以及Interactivity and AJAX/Client Side Scripts下面的相关例子。

        Url链接,图表控件中,有一大半的控件都有Url及Tooltip的属性,你可以设置此属性,在鼠标点击的时候,代到其它相应的页面去。

      建议大家看看官方例子中的Interactivity and AJAX部份,很精彩:)

    例子:建立一个Cpu信息和内存使用的实时统计表

        下面写一个小例子,建立一个系统的内存实时统计图表,使用到了Ajax的方法,以及Windows Api取得系统内存的方法。

        首先,建立一个Aspx页面,拖动一个图表控件到页面,设置图表控件的属性如下:

      其中,MEMORY_INFO,ComputerInfo是一个定义的结构体及调用Win32 API接口的一个访问类。程序分别取得每一个图表对象,每次加载的时候,都重新取得当前的内存和Cpu信息,再在图表上添加一个点,需要注意的是,一定要设置图表控件的EnableViewState属性为True,否则无法记录状态。
    1. <asp:Chart ID="ChartMemory" runat="server" BackColor="LightSteelBlue" 
    2. BackGradientStyle="TopBottom" BackSecondaryColor="White" EnableTheming="False" 
    3. EnableViewState="True" Height="363px" Width="415px">
    4. <Legends>
    5. <asp:Legend Alignment="Center" Docking="Bottom" Name="Legend1" Title="图例">
    6. </asp:Legend>
    7. </Legends>
    8. <Titles>
    9. <asp:Title Font="微软雅黑, 16pt" Name="Title1" Text="系统内存监控图表">
    10. </asp:Title>
    11. </Titles>
    12. <Series>
    13. <asp:Series BorderColor="White" BorderWidth="3" ChartArea="ChartArea1" 
    14. ChartType="Spline" Legend="Legend1" Name="已使用物理内存" XValueType="Double" 
    15. YValueType="Double">
    16. </asp:Series>
    17. <asp:Series BorderWidth="3" ChartArea="ChartArea1" ChartType="Spline" 
    18. Legend="Legend1" Name="全部占用内存">
    19. </asp:Series>
    20. <asp:Series ChartArea="ChartArea2" ChartType="StackedArea" Legend="Legend1" 
    21. Name="CPU">
    22. </asp:Series>
    23. </Series>
    24. <ChartAreas>
    25. <asp:ChartArea BackColor="224, 224, 224" BackGradientStyle="LeftRight" 
    26. Name="ChartArea1">
    27. </asp:ChartArea>
    28. <asp:ChartArea Name="ChartArea2">
    29. </asp:ChartArea>
    30. </ChartAreas>
    31. </asp:Chart>
    复制代码
    一共建立了两个绘图区,一个用于呈现内存使用情况的在ChartArea1区域,另一个则是呈现Cpu使用情况的,放置在ChartArea2区域了。一共有三个图表,分别表示已使用的物理内存、全部占用的物理内存,以及Cpu使用显示的情况。

    添加一个Ajax的计时器以及Ajax的ScriptManager,UpdatePanel,把计时器和图表控件都拖进UpdatePanel里面。设置计时器的间隔时间为一秒钟(1000),双击计时器,写如下代码:
    1. static PerformanceCounter pc = new PerformanceCounter("Processor", "% Processor Time", "_Total"); 
    2. protected void Timer1_Tick(object sender, EventArgs e)

    3. MEMORY_INFO MemInfo = new MEMORY_INFO();
    4. ComputerInfo.GlobalMemoryStatus(ref MemInfo);
    5. //UseMemory
    6. Series series = ChartMemory.Series[0];
    7. int xCount = series.Points.Count == 0 ? 0 : series.Points.Count - 1;
    8. double lastXValue = series.Points.Count == 0 ? 1 : series.Points[xCount].XValue + 1;
    9. double lastYValue = (double)(MemInfo.dwTotalPhys-MemInfo.dwAvailPhys)/1024/1024;
    10. series.Points.AddXY(lastXValue, lastYValue);
    11. //Total Memory
    12. series = ChartMemory.Series[1];
    13. lastYValue = (double)(MemInfo.dwTotalVirtual+MemInfo.dwTotalPhys-MemInfo.dwAvailPhys - MemInfo.dwAvailVirtual)/1024/1024;
    14. series.Points.AddXY(lastXValue, lastYValue);

    15. //CPU
    16. series = ChartMemory.Series[2];
    17. lastYValue = (double)pc.NextValue();
    18. series.Points.AddXY(lastXValue, lastYValue);

    19. // Remove points from the left chart side if number of points exceeds 100.
    20. while (this.ChartMemory.Series[0].Points.Count > 80)
    21. {
    22. // Remove series points
    23. foreach (Series s in this.ChartMemory.Series)
    24. {
    25. s.Points.RemoveAt(0);
    26. }
    27. }
    28. // Adjust categorical scale
    29. double axisMinimum = this.ChartMemory.Series[0].Points[0].XValue;
    30. this.ChartMemory.ChartAreas[0].AxisX.Minimum = axisMinimum;
    31. this.ChartMemory.ChartAreas[0].AxisX.Maximum = axisMinimum + 99;
    32. }
    复制代码
    附上取得内存信息的类代码:
    1. /// <summary>
    2. ///取得计算机的系统信息
    3. /// </summary>
    4. public class ComputerInfo
    5. {
    6. /// <summary>
    7. /// 取得Windows的目录
    8. /// </summary>
    9. /// <param name="WinDir"></param>
    10. /// <param name="count"></param>
    11. [DllImport("kernel32")]
    12. public static extern void GetWindowsDirectory(StringBuilder WinDir, int count);
    13. /// <summary>
    14. /// 获取系统路径
    15. /// </summary>
    16. /// <param name="SysDir"></param>
    17. /// <param name="count"></param>
    18. [DllImport("kernel32")]
    19. public static extern void GetSystemDirectory(StringBuilder SysDir, int count);
    20. /// <summary>
    21. /// 取得CPU信息
    22. /// </summary>
    23. /// <param name="cpuinfo"></param>
    24. [DllImport("kernel32")]
    25. public static extern void GetSystemInfo(ref CPU_INFO cpuinfo);
    26. /// <summary>
    27. /// 取得内存状态
    28. /// </summary>
    29. /// <param name="meminfo"></param>
    30. [DllImport("kernel32")]
    31. public static extern void GlobalMemoryStatus(ref MEMORY_INFO meminfo);
    32. /// <summary>
    33. /// 取得系统时间
    34. /// </summary>
    35. /// <param name="stinfo"></param>
    36. [DllImport("kernel32")]
    37. public static extern void GetSystemTime(ref SYSTEMTIME_INFO stinfo);

    38. public ComputerInfo()
    39. {
    40. }
    41. }

    42. //定义CPU的信息结构 
    43. [StructLayout(LayoutKind.Sequential)]
    44. public struct CPU_INFO
    45. {
    46. public uint dwOemId;
    47. public uint dwPageSize;
    48. public uint lpMinimumApplicationAddress;
    49. public uint lpMaximumApplicationAddress;
    50. public uint dwActiveProcessorMask;
    51. public uint dwNumberOfProcessors;
    52. public uint dwProcessorType;
    53. public uint dwAllocationGranularity;
    54. public uint dwProcessorLevel;
    55. public uint dwProcessorRevision;
    56. }
    57. //定义内存的信息结构 
    58. [StructLayout(LayoutKind.Sequential)]
    59. public struct MEMORY_INFO
    60. {
    61. public uint dwLength;
    62. public uint dwMemoryLoad;
    63. public uint dwTotalPhys;
    64. public uint dwAvailPhys;
    65. public uint dwTotalPageFile;
    66. public uint dwAvailPageFile;
    67. public uint dwTotalVirtual;
    68. public uint dwAvailVirtual;
    69. }
    70. //定义系统时间的信息结构 
    71. [StructLayout(LayoutKind.Sequential)]
    72. public struct SYSTEMTIME_INFO
    73. {
    74. public ushort wYear;
    75. public ushort wMonth;
    76. public ushort wDayOfWeek;
    77. public ushort wDay;
    78. public ushort wHour;
    79. public ushort wMinute;
    80. public ushort wSecond;
    81. public ushort wMilliseconds;
    82. }
  • 相关阅读:
    [uoj173]鏖战表达式
    [cf1168E]Xor Permutations
    [cf578F]Mirror Box
    [cf1261F]Xor-Set
    [loj2506]tree
    [atARC068F]Solitaire
    [atARC066F]Contest with Drinks Hard
    [cf1270I]Xor on Figures
    [cf516D]Drazil and Morning Exercise
    无题
  • 原文地址:https://www.cnblogs.com/easypass/p/1631525.html
Copyright © 2011-2022 走看看