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






2.43/5 (4投票s)
2004年8月4日
5分钟阅读

49198

1899
简洁即美德:如何在几乎任何地方绘制一个简单的饼图
引言
欢迎来到另一篇S.I.V.文章。关于S.I.V.的解释,请查看“作者的文章”那个漂亮的链接。这篇(又)是来自一个菜鸟,写给菜鸟的 :-) 我正在读一本书(这里不能商业化..),我看到一段关于在圆周上移动的代码。遵循老话“遇到麻烦或疑虑,就原地打转,尖叫和喊叫。”,我写了这篇文章只是为了练习。实际上,这算是我的GDI入门教程,因为我以前从没画过任何东西。
总之,既然这是入门教程,很可能存在很多大忌、bug和其他问题。随意找出它们,修正它们,或者告诉我修正它们。
背景
我将它写成两个独立的类而不是继承像CStatic
这样的类,是因为这样,你几乎可以在任何地方使用它:对话框、控件、SDI/MDI文档,或者别的什么。只要那个东西有一个DC,你就可以在上面绘制一个图表。
另一件重要的事是,这些类只处理**百分比**。这意味着你不能给它们提供这样的数据:“1994年的销售收入”,然后给出:2025098美元,1252366美元,等等。只能是这样的:“按性别划分的IT专业人士”,然后给出:64%男性,36%女性(这是来自克罗地亚的真实数据)。
Using the Code
好吧,实际上这很简单:将PieChart.h和PieChart.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
- 目标DCptCenter
- 我们饼图的中心点,以逻辑单位表示。其他一切都以此点为相对。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日 - 初始发布
许可证
本文未附加明确的许可证,但可能在文章文本或下载文件本身中包含使用条款。如有疑问,请通过下面的讨论区联系作者。
作者可能使用的许可证列表可以在此处找到。