Programming MS Office 2000 Web Components第三章第二节

** 译者说明: ** 欢迎访问我的 Blog: http://blog.csdn.net/daidaoke2001/

译文中的错误或不当之处望不吝指出,这也是我坚持翻译工作的最大动力。

我的 Email : [email protected]

如需转载,请事先通知。


** 第三章第二节 ** ** ** ** 图表组件高级功能 ** ** **

我们已经了解了关于图表生成的所有基础知识,现在让我们来研究图表组件一些更高级的功能,尤其是那些在传统的 Excel 图表生成中没有的功能。许多这些功能都会在本书第二部分所介绍的解决方案中被使用。当我们讨论这些解决方案时,如果您记不清某个特定功能的基础知识,可以回头参考本节,以获得更一般意义上的解释。

** “图表空间”中的多重图表 ** ** **

前面提到过,图表控件可以在名为图表空间的地方一次显示多个图表。其实图表控件的顶级编程接口就叫做 ChartSpace ,当您在容器中插入一个新的图表控件时,控件的缺省名称通常叫做 ChartSpace1 。

当您需要显示多个相关联的图,并且要能够方便的对各图进行比较时,在一个控件中同时显示多重图表的功能就会很有用。人们常称这种设计为“小型多重设计”,它可以成为一个强大的分析工具。例如,如果您需要同时显示各时间段的销售数据,销售人员,以及地理位置,您就可以为每个国家创建一个图表,在每个图表中将销售人员显示为系列,时间显示为类别。图 3 - 18 显示了最后的图表可能的样子。

图表控件可以在同一个图表空间中显示最多 16 个图表,但是所有的图表必须共享同一组类别。如果两个图表各自包含不同的一组类别,用于所有图表的那组类别将会是每个图表的类别的合集。这是因为小型多重设计依赖各图表中的类别、系列和轴上的刻度的一致性,使得您能够容易的发现各图表之间明显的区别和趋势。

图 3 - 18 。一个图表空间中的多重图表。

图表控件不会自动为您在各个图表中设置值轴的刻度,但是您可以使用来自随书光盘中 Chap03 文件夹下的 MultipleCharts.htm 文件中的一小段代码十分轻松的完成这个功能。

'------------------------------------------------------------------------

' NormalizeCharts()

'

' 目的: 将图表空间中所有各图表的值轴设为相同,以便您能准确的比较各值。

' 传入参数:cspace = 指向ChartSpace对象的引用

' nAxis = 值轴在WCAxes集合中的索引

'

Sub NormalizeCharts(cspace, nAxis)

' 局部变量

Dim cht ' 指向chart对象的临时引用

Dim ax ' 指向axis对象的临时引用

Dim nMax ' 各轴上的最大值

nMax = 0

' 遍历所有的图表一次,获得所有图表中值轴的最大值

For Each cht In cspace.Charts

Set ax = cht.Axes(nAxis)

If ax.Scaling.Maximum > nMax Then

nMax = ax.Scaling.Maximum

End If

Next 'cht

' 再次遍历各图表,设置最大值

For Each cht In cspace.Charts

Set ax = cht.Axes(nAxis)

ax.Scaling.Maximum = nMax

Next 'cht

End Sub 'NormalizeCharts()

这段代码对图表空间中的所有 Chart 对象执行两次遍历。第一次遍历确定所有值轴上的最大值,第二次将各图表值轴上的 Scaling.Maximum 属性设置为获得的最大值,这样所有图表在它们的值轴上都具有相同的最大值。请注意只有在您的图表具有值轴时这种方法才是必要的――因此它并不适用于多重饼图,多重堆积饼图,或多重圆环图。

您也可以通过调整顶层 ChartSpace 对象的 ChartLayout 和 ChartWrapCount 属性来控制控件空间中多重图表的布局。可以通过设置 ChartLayout 属性来水平平铺或垂直平铺各图表。 ChartWrapCount 属性控制每行(或每列)在一行(或一列)中显示多少图表。也可以通过调整每个 WCChart 对象的 HeightRatio 和 WidthRatio 属性扩大或缩小特定图表的尺寸。

** 服务端的应用 ** ** **

除了能够以 COM 控件的形式寄宿在窗体上之外,每个 Office Web 组件都能以不可见,位于内存中的方式被使用。但是当运行在一个 web server 的环境下时,图表组件可能是 Office Web 组件中最让人关注的部分。当 OWC 小组在微软内部首次开始发行 beta 版本时,我们立刻就收到来自公司的许多其它小组的 email ,他们希望知道如何在服务器上使用 Chart 控件来生成动态数据的图表(大部分情况下,是为了提供 bug 的统计报告)。许多商业活动中都包括用于评测产品或运作过程的一组度量标准;商业主管们一直梦想着只要打开他(或她)的 web 浏览器就可以看到反映实时更新的数据的图表。因为图表控件可以在服务器端使用,并能够产生图表自身的 GIF 格式的图形拷贝,所以许多开发者发现在服务端利用图表控件来生成既能被用于互联网环境,也能被用于包含各种不同类型客户端电脑的企业环境中的实时数据的图表,是一个非常棒的方法。

当在服务端使用图表控件时,您可以使用它的所有标准功能。还有,之前我们所讨论的那些用于将不同类型的数据装载到图表中的代码在服务端环境中也是可用的。通常,会使用一个服务端对象或服务器上另一段脚本产生的 ADO Recordset 对象来装载图表控件。您可以引用图表中的所有元素,就好像它们显示在屏幕上一样,在您完成创建图表后,可以使用 ChartSpace 对象的 ExportPicture 方法来将 GIF 图形写入一个文件中。在当前版本中, Chart 控件只支持输出为 GIF 图形格式,不过您可以指定输出图形的任意宽度和高度(以象素为单位)。

关于服务端应用,我需要说明的最后一点是:您应该检查您的 Office2000 附带的许可证协议,并询问微软应用开发者客户协会( ADCU )的代表关于在 web 服务器上使用 Office Web 组件来开发解决方案的更多信息。在本书写作期间, Office 市场小组正在将一个特殊的 Office Web 组件服务端使用许可和 Office 使用协议合并在一起。虽然很多细节还没有最后确定,但是这个许可预计将不会限制客户端数目,这样您就可以在一个 Internet 站点上使用这些组件了。

** 分割轴 ** ** **

另一个普遍需要的图表生成功能是在某一点分割值轴的能力,这使得您可以在同一个值轴上绘制很小的数值和很大的数值,并仍然能够显示局部的变化,图 3 - 19 描述了一个常见的分割轴图表。

图 3 - 19 。一个分割轴图表。

图表在每个值轴上可以有一个分割点,您可以指定值轴上分割开始和结束的确切值。可以在设计阶段在属性工具箱中完成这个操作:先选择值轴,然后使用属性工具箱中的 Split Axis 段来设置开始和结束的分割值。您也可以在运行时通过代码来完成:先将轴的 Scaling 对象的 HasSplit 属性设置为 True ,然后再设置 SplitMinimum 和 SplitMaximum 属性。

** 调整轴的刻度 ** ** **

缺省情况下,图表控件会为值轴自动选择一个最小值和最大值,使得所有的数据点均可见,并且在绘图区周围留下一些空白。但如果您需要覆盖这些缺省设置,可以手工调整一个轴的 scaling 属性来精确的设置您所需要的最小值和最大值。

每个 WCAxis 对象都有一个 Scaling 属性,它返回一个 WCScaling 对象。 WCScaling 对象具有名为 Minimum 和 Maximum 的属性,能够通过这些属性来精确的设置最小值或最大值,或者从这些属性中读取当前值。您还可以通过将 HasAutoMinimum 和 HasAutoMaximum 属性设置为 True ,来强迫轴变回成自动设置刻度的状态。

您还可以利用 WCScaling 对象来告诉轴使用对数刻度代替线性刻度。将 WCScaling 的 Type 属性设置为 chScaleTypeLogarithmic 常量,可以将刻度变为对数刻度,将 Type 属性重新设置回 chScaleTypeLinear 常量,可将刻度又变成线性刻度。您也可以通过调整 LogBase 属性来设置对数刻度的基数。

另一个您可以调节的有趣设置是 Orientation 属性,它可以使刻度以从最小值到最大值的相反顺序显示。对于一个值轴它可能有用,也可能没有用,但是这是将类别轴上的各类别以相反的顺序显示的最简单的方法。

Scaling 对象的使用中最有趣的部分可能是在一个轴上模拟缩放和位移。如果您的图表中数据点的密度很高,那么它可以用来允许分析者放大轴上的某一特定段,然后在轴上移动来观察各段。您可以通过简单的操作 Scaling 对象的 Minimum 和 Maximum 属性来达到这个目的,这会造成图表缩放和位移的效果,因为操作这两个属性会使图表在屏幕上相同的可视距离中显示较少的数值距离。

** 自制图表标签 ** ** **

图表组件并不具有您在 Excel 中肯定看到过的图表标签功能。图表标签是一个较大的屏幕标签,当您将鼠标停留在一个数据点或图表元素上时,它会显示出来。图表标签显示数据点的值,类别,系列,以及其它一些有用的信息。坏消息是这些图表标签并不是图表控件本身的属性;好消息是您可以通过捕捉图表控件触发的一些事件来自己添加这些标签。在本书第二部分,我会解释您如何才能创建这些自制的图表标签。现在,我仅仅讲述它们的工作原理。

图表控件在鼠标在控件上方移动时会触发 MouseMove 事件。在这个事件中,您可以查询鼠标当前相对于控件左上角点的 X 和 Y 坐标。这个 X 和 Y 坐标不仅能够帮助您在鼠标所在的位置防止其它元素,您还能将他们传递给 ChartSpace 对象的 RangeFromPoint 方法,来获得当前位于鼠标下方的 chart 对象。例如,如果您的鼠标位于一个数据点的上方,这个方法会返回一个 WCPoint 对象,利用这个对象,您可以判断这个数据点的父系列,类别,以及使用 GetValue 方法来获得这个数据点的具体值。您也可以使用这个 WCPoint 对象来调整这个数据点的格式,这就意味着您能够:例如,改变边框的颜色来高亮显示这个数值,或者将内部颜色改变成一个较暗的颜色或当前填充颜色的一个较浅的阴影。如果鼠标位于一个图表元素之上,例如图例,您就可以从这个方法的返回中获得一个 WCLegend 对象。使用 VBScript 和 VBA 中的 TypeName 方法来判断您从 RangeFromPoint 方法的返回中获得的是什么类型的对象。您也可以使用 ChartSpace 对象的 SelectionType 属性来判断从 Selection 属性返回的对象的类型。

请参考随书光盘 Chap03 文件夹下的 ReactingToMouse.htm 文件,文件中有使用图表组件事件和响应鼠标的例子。

** 为什么叫做 ** ** RangeFromPoint? **

当我首次开始注意图表组件编程模型中隐藏的细节时,我问图表组件的项目经理: Jason Cahill ,为什么这个方法的名字叫做 RangeFromPoint ,很明显它和 range 无关,并且返回的是 chart 对象。我问道:“为什么不叫做 ObjectFromPoint 呢?”。

Jason 解释说,当微软的辅助功能组初次决定为盲人创建屏幕阅读器时,他们需要 Excel 中的一个方法能够返回鼠标下方的当前区域,以便他们能够使用计算机的声音系统来阅读单元格中的值。(如果您对此很迷惑,这里有相应的解释信息:辅助功能组的目的是使计算机能够帮助那些残疾人士,屏幕阅读器使用音响来为盲人大声阅读屏幕上的文字。) Excel 将这个方法正确的命名为 RangeFromPoint ,因为它根据一个 (X,Y) 点返回一个区域。但是,辅助功能组将这个方法的名字写进了他们的应用程序的代码中,结果现在任何希望为屏幕阅读器提供辅助功能的人都必须实现 RangeFromPoint 方法,即使他或她的应用程序与电子表格的区域没有任何关系。

** 附录:英文原文 ** ** **

** Advanced Functionality of the Chart Component **

Now that we've covered all the basics of charting, let's explore a few of the more advanced features of the Chart component, especially those not found in traditional Excel charting. You will see many of these features put to use in the solutions presented in Part II of this book. When we get to those solutions, if you need to refresh your memory on the basics of any particular feature, simply refer back to this section for a more general explanation.

** Multiple Charts in "Chart Space" **

As noted earlier, the Chart control can display more than one chart at a time in what is known as a chart space. The top-level programming interface for the Chart control is actually called ChartSpace, and when you insert a new Chart control into a container, the default name given the control is usually ChartSpace1.

Showing multiple charts at once in a control is useful for displaying related plots that you want to compare in one glance. This design, often called small multiples, can be a powerful analysis tool. For example, if you need to show sales data across time, salespeople, and geography simultaneously, you might create one chart for each country, each displaying the salespeople as series and the time as categories. Figure 3-18 shows what the resulting charts might look like.

The Chart control can show up to 16 charts in the same chart space, but all the charts must share the same set of categories. If two charts have a different set of categories, the set of categories used for both charts will be the union of the categories from each chart. This is because small-multiple designs rely on the consistency of the categories, series, and axis scalings among the various charts so that you notice large differences and trends easily.

** < **

Published At
Categories with Web编程
Tagged with
comments powered by Disqus