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

S.I.V.: 一个带有图例的简单饼图

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.43/5 (4投票s)

2004年8月4日

5分钟阅读

viewsIcon

49198

downloadIcon

1899

简洁即美德:如何在几乎任何地方绘制一个简单的饼图

引言

欢迎来到另一篇S.I.V.文章。关于S.I.V.的解释,请查看“作者的文章”那个漂亮的链接。这篇(又)是来自一个菜鸟,写给菜鸟的 :-) 我正在读一本书(这里不能商业化..),我看到一段关于在圆周上移动的代码。遵循老话“遇到麻烦或疑虑,就原地打转,尖叫和喊叫。”,我写了这篇文章只是为了练习。实际上,这算是我的GDI入门教程,因为我以前从没画过任何东西。

总之,既然这是入门教程,很可能存在很多大忌、bug和其他问题。随意找出它们,修正它们,或者告诉我修正它们。

背景

我将它写成两个独立的类而不是继承像CStatic这样的类,是因为这样,你几乎可以在任何地方使用它:对话框、控件、SDI/MDI文档,或者别的什么。只要那个东西有一个DC,你就可以在上面绘制一个图表。

另一件重要的事是,这些类只处理**百分比**。这意味着你不能给它们提供这样的数据:“1994年的销售收入”,然后给出:2025098美元,1252366美元,等等。只能是这样的:“按性别划分的IT专业人士”,然后给出:64%男性,36%女性(这是来自克罗地亚的真实数据)。

Using the Code

好吧,实际上这很简单:将PieChart.hPieChart.cpp包含到你的项目中,就可以开始使用了。最简单的方法是使用AutoDelete功能。由于CPieChart包含一个CPieChart对象的数组,所以在CPieChart对象被删除时自动删除它们会很好。如果出于某种原因,你不想这样做(例如,你想在其他地方重用你的‘切片’),你应该关闭AutoDelete功能,或者通过使用CPieChart::RemoveSlice()函数显式删除所有切片,该函数只移除而不删除它们。

如果你查看示例,你会发现这篇文章的关键部分是CPieChart::Draw2D(...)CPieChart::DrawLegend(...)。我将我的绘图函数命名为Draw2D,因为我可能会决定创建另一个用于(惊喜,惊喜)3D苹果派的函数,即Draw3D

所以,关于Draw2D

void CPieChart::Draw2D(
        CPaintDC* pDC,
        CPoint ptCenter,
        int nRadius,
        BOOL bShowTitle,
        int nLegend,
        BOOL bFillExtra)
  • pDC - 目标DC
  • ptCenter - 我们饼图的中心点,以逻辑单位表示。其他一切都以此点为相对。
  • nRadius - 我们饼图的半径,也以逻辑单位表示
  • bShowTitle - 是否显示标题。显示,还是不显示。默认:TRUE
  • nLegend - 是否显示图例?显示在哪里?默认:PIELEGEND_NONE
  • bFillExtra - 如果百分比数据不完全正确,是否忽略?默认:FALSE

关于bFillExtra的更多信息:例如,如果你设置的数据使得所有切片的总和不足一个完整的圆(即,不等于100%),bFillExtra会取最后一个切片并将其扩展以填充剩余的奶酪派。在演示应用程序中,点击菜单View->Dialog Sample,并仔细观察:名为“Content”的切片百分比设置为零。然而,当调用Draw2D时,它看起来是这样的

// inside CChartDlg::OnPaint()
m_chart.Draw2D( &dc, center, 70, TRUE, PIELEGEND_RIGHT, TRUE );

如果你在OnInitDialog()中修改这些值,例如将“Spam”切片的百分比从57更改为33,你会发现“Content”的值也随之动态改变(在这种情况下变为25%)。重新编译并运行示例,你就会明白我的意思。接下来

void CPieChart::DrawLegend(
        CPaintDC* pDC,
        CPoint ptLocation,
        BOOL bFillExtra )

除了ptLocation之外,其他都和Draw2D一样。在这种情况下,它是我们图例的**左上角**。这段代码之所以放在一个单独的函数中,是因为你可能想将图例绘制在饼图之外的其他地方。在这种情况下,你只需要注意ptLocation。同时也要记住使用与Draw2D相同的bFillExtra值。

关注点

我认为这对于我的第一个绘图类(或类们)来说相当不错。你可能会喜欢这两个类都继承自CObject并且可以用于文档/视图架构(即,内置了序列化)。我希望它们使用起来很直接,如果不是,好吧,我尽力了。(-: 示例是一个Unicode构建(我希望),所以我猜这意味着它是Unicode“兼容”的。

问题与bug

要(不)做的事情

  • 也许有一天使用MemDC,这样就不会有任何闪烁
  • 使其能够使用“真实”数据,这样你就不必自己计算百分比
  • 创建一个Draw3D函数,以某种方式绘制一个3D饼图
  • 某天找到个女朋友结婚(但前提是她会做派)
  • 可能还有很多我现在想不出的事情..

Copyleft

没新意:Copyleft © T1TAN 2004 - 3827。你可以以任何方式使用此代码,打印它并烧毁它,向它吐口水,倒着读,甚至在商业应用程序中使用它(是吧..)。你唯一不能做的是出售代码和/或声称它是你的。可以吗?

注意:如果你打算给这篇文章打差评(或者好评,或者至少是糟糕的评价),请附上原因,以便我改进我未来的写作。没有评论就是唯一糟糕的评论!谢谢!(-

历史

  • 2004年7月28日 - 初始发布

许可证

本文未附加明确的许可证,但可能在文章文本或下载文件本身中包含使用条款。如有疑问,请通过下面的讨论区联系作者。

作者可能使用的许可证列表可以在此处找到。

© . All rights reserved.