65.9K
CodeProject 正在变化。 阅读更多。
Home

用于显示饼图的控件,具有高度可定制的格式

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.96/5 (134投票s)

2006 年 3 月 13 日

4分钟阅读

viewsIcon

204863

downloadIcon

3897

一个用于显示具有高度可定制格式的饼图的控件。

Sample Image

引言

我的想法是创建一个可以生成三维饼图控件的控件。我在CodeProject上找到了几个其他的控件,但没有一个允许我指定倾斜度、旋转度、厚度、半径以及表面亮度和透明度。此外,许多控件缺乏事件驱动的钩子,例如在项目被点击或鼠标焦点改变时触发的事件。而且,没有一个控件是按照标准的Windows Forms控件的风格编写的,例如,使用带有`Items`集合来存储`ListViewItem`的`ListView`控件。因此,我着手编写一个提供这些功能以及易于扩展的接口的控件。

背景

作为我`PieChart`的基础,我大量参考了 Julijan Sribar 编写的 饼图控件的外观和感觉。除了他的控件提供的功能外,`PieChart`还允许您指定饼图在平面上的倾斜度,以及半径是自动调整大小还是固定的。为了进一步辅助使用该控件进行设计,`PieChart`的`Items`集合在Visual Studio的设计时是可编辑的。

使用代码

从使用角度来看,该控件的结构非常类似于标准的Windows Forms控件。`PieChart`本身包含一个`Items`属性,其类型为`PieChart.ItemCollection`。此集合存储`PieChartItem`类型的对象。每个`PieChartItem`包含`Text`、`ToolTipText`、`Color`、`Offset`和`Weight`属性。要创建和使用该控件,请使用Visual Studio中的Windows Forms设计器将`PieChart`添加到窗体中。然后,您可以像这样轻松地使用该控件:

PieChart pieControl = new PieChart();
// add an item with weight 10, color Red,
// text "Text", and tool-tip text "ToolTipText"
pieControl.Items.Add(new PieChartItem(10, 
      Color.Red, "Text", "ToolTipText"));
// add another item with weight 5, color Blue, text "Blue",
// tool-tip text "BlueTips", and an offset
// of 25 pixels from the center of the pie
pieControl.Items.Add(new PieChartItem(5, 
       Color.Blue, "Blue", "BlueTips"));
// set the control to automatically
// fit the pie inside the control
pieControl.AutoSizePie = true;
// set the control to only show the
// text if it fits inside its slice
pieControl.TextDisplayMode = 
   PieChart.TextDisplayTypes.FitOnly;

该控件为普通项目和聚焦项目定义了特殊的样式。当鼠标移到控件上时,项目将获得焦点。默认的项目样式可以使用`ItemStyle`属性设置,而聚焦的项目样式可以使用`FocusedItemStyle`属性设置。以下是项目允许的样式。

  • 表面透明度

    一个介于0和1之间的浮点值,它乘以项目颜色 alpha 通道以确定项目的透明度。

  • 表面亮度因子

    一个介于-1和1之间的浮点值,它修改项目的表面亮度。正值会增加亮度(1增加亮度至白色),而负值会降低亮度(-1会导致黑色)。

  • 边缘亮度因子

    一个介于-1和1之间的浮点值,它使用与`SurfaceBrightnessFactor`相同的算法修改项目的边缘亮度。

您可能希望在属性更改或控件状态修改时定义自定义操作。以下是该控件触发的其他事件列表。

  • ItemClicked
  • ItemFocusChanging
  • ItemFocusChanged
  • AutoSizePieChanged
  • RadiusChanged
  • InclinationChanged
  • RotationChanged
  • ThicknessChanged
  • ShowEdgesChanged
  • TextDisplayModeChanged
  • ShowToolTipsChanged

打印和保存

您可以使用该控件打印和保存图表。在演示中,File->Save菜单允许您将图表保存为PNG、JPEG、GIF或BMP格式。图像将具有与控件相同的属性,并根据`PieChart`的`Padding`、`Radius`和`AutoSizePie`属性的大小进行调整以适应图表。但是,您也可以在代码中指定不同的尺寸。此外,该控件可以使用`PrintDocument`打印您的图表。只需使用`PieChart.AttachPrintDocument`方法将`PrintDocument`注册到`PieChart`,然后调用`PrintDocument.Print`方法即可开始打印。注意:我无法访问打印机,并且仅在Microsoft Office Document Image虚拟打印机上进行了打印测试。请及时向我报告任何打印错误。

关注点

我个人认为,当一个控件在循环编辑项目时不断尝试重绘自己时,这很令人讨厌。例如,您可能会编写一个循环,遍历您的项目并更改所有项目的文本。

foreach (PieChartItem item in PieChart1.Items)
{
  item.Text = item.Weight.ToString();
}

由于更改`PieChartItem`的`Text`属性会导致控件被重绘,因此控件会为每个项目重绘一次。为了避免这种问题,我创建了`BeginModification`和`EndModification`函数。每次调用`BeginModification`时,计数器会增加;每次调用`EndModification`时,计数器会减少。只要计数器大于0,对控件的更改就不会导致控件刷新。在最后一次调用`EndModification`时,如果控件在结构或视觉上已修改,则会刷新。请注意,调用`BeginModification`而不调用相应的`EndModification`将导致控件永远不会重绘!因此,您应该将`EndModification`的调用放在`try`-`catch`块的`finally`块中。以下代码修改了循环,使其不会为每个项目重绘:

try
{
  PieChart1.BeginModification();
  foreach (PieChartItem item in PieChart1.Items)
  {
    item.Text = item.Weight.ToString();
  }
}
finally
{
  PieChart1.EndModification();
}

历史

  • 修订0:初始版本。
  • 修订1:增加了对打印、保存和更改控件内边距的支持。
© . All rights reserved.