C2DPushGraph: 推送图控件 






4.64/5 (34投票s)
2005年4月25日
5分钟阅读

136939

3893
一个推送图表控件,类似于 Microsoft 任务管理器中的图表控件。
引言
在我过去的编程经验中,我经常希望在图表中显示和监控某个操作的速率或性能。无论是写入操作的速率还是每秒提取的内容结果数量,我都一直认为一个类似于 Windows XP 任务管理器(Ctrl+Alt+Delete)性能和网络选项卡中的图表会非常有用。在 Google 上快速搜索图表控件克隆无果后,我决定自己克隆它会是一次有趣且有益的经历。
随着时间的推移,克隆控件被证明很容易,我决定添加更多功能,并使其在几乎所有方面都可以完全自定义。最终,当一切尘埃落定,我面对着本文围绕的控件。它看起来和行为令人惊讶地漂亮,尽管开发得如此仓促。但谁关心它的过去,让我们继续看看如何轻松实现它…

使用代码
如果你们中有读过我上一篇文章(CGoogle)的,你们会知道我正在用一种新的风格来写我的文章。我将尝试更快速地提供关键信息,而不是喋喋不休地谈论某个特性。
将控件添加到对话框
有两种方法可以将控件添加到对话框,一种是政治上正确的做法,另一种是简单的方法。
如果你正在寻找简单的方法,首先在对话框中添加一个静态控件(我通常使用图片控件作为边框)。然后,为新创建的控件设置所需的样式和唯一的 ID。之后,你应该将控件定位并拉伸到你想要图表显示的位置。现在,在对话框类中添加一个新的变量,类型为 `C2DPushGraph`。最后,在 `OnInitDialog` 中调用 `CreateFromStatic`,并将控件 ID 作为第一个参数,父窗口作为第二个参数(如果你在父对话框类中调用 `CreateFromStatic`,可以使用 `'this'` 指针)。
政治上正确的方法涉及使用资源编辑器中的自定义控件项,并将 `C2DPushGraph` 指定为类名。从那里,你可以像对待任何自定义控件一样进行操作。
设置图表范围
在继续之前,你应该设置图表的范围。范围是可能的最小和最大幅度(例如,CPU 使用率图表可能最小为 0,最大为 100)。要设置范围,你可以使用以下一个或多个函数:`SetMaxPeek`、`SetMinPeek` 或 `SetPeekRange`。
添加新线
`C2DPushGraph` 的两个最重要部分显然是能够添加新线以及用新数据更新该线。所以我们将从添加线开始。要添加新线,你需要调用 `AddLine`,它的原型如下:`AddLine(UINT uiLineID, COLORREF crColor)`。第一个参数是线的唯一 ID,这是你稍后用来指示正在更改特定线的标识。第二个参数是线的颜色。我强烈建议使用预处理器定义或命名常量作为你的线 ID,这会让事情变得容易得多。
将新点推送到线
与典型的图表不同,要为线添加新点,你只需要提供点的幅度或 Y 坐标。每个幅度都应该是你图表范围内的数字,尽管如果它大于或小于当前的最小和最大范围值,它将被调整到最近的有效数字。要将新点推送到线,你需要调用 `Push`,它的原型如下:`Push(int nMagnitude, UINT uiLineID)`。
你会注意到,在将新幅度推送到线后,图表不会改变。这是因为你必须首先将所需的幅度推送到任意数量的线,然后调用 `Update()`。
自定义图表的视觉外观
在列出用于设置和检索图表视觉外观的函数之前,这里有一个快速的图示,展示了图表控件的最基本属性。

可用于设置属性的函数
- C2DPushGraph::SetBGColor- void SetBGColor( COLORREF crColor )- crColor:新的背景颜色。
 
- C2DPushGraph::SetGridColor- void SetGridColor( COLORREF crColor )- crColor:新的网格颜色。
 
- C2DPushGraph::SetGridSize- void SetGridSize( unsigned short usWidthAndHeight ) - usWidthAndHeight:每个网格单位的宽度/高度(以像素为单位)。
 
- C2DPushGraph::SetInterval- void SetInterval( unsigned short usInterval ) - usInterval:每个幅度点之间的距离(以像素为单位)。
 
- C2DPushGraph::SetLabelForMax- void SetLabelForMax( LPCTSTR lpszLabel )- lpszLabel:用于标记图表最大幅度的 C 字符串。
 
- C2DPushGraph::SetLabelForMin- void SetLabelForMin( LPCTSTR lpszLabel )- lpszLabel:用于标记图表最小幅度的 C 字符串。
 
- C2DPushGraph::SetLineColor- bool SetLineColor( COLORREF crColor, UINT uiLineID )- crColor:线的新颜色。
- uiLineID:线的 ID。
 
- C2DPushGraph::SetTextColor- void SetTextColor( COLORREF crColor )- crColor:最小和最大标签的新颜色。
 
- C2DPushGraph::ShowAsBar- bool ShowAsBar( UINT uiLineID, bool bAsBar ) - UiLineID:线的 ID。
- bAsBar:如果希望该线以条形图格式显示,则为 true;否则为 false。
 
- C2DPushGraph::ShowGrid- void ShowGrid( bool bShow = true) - bShow:如果显示网格,则为 true;否则为 false。
 
- C2DPushGraph::ShowLabels- void ShowLabels( bool bShow = true) - bShow:如果显示最小和最大标签,则为 true;否则为 false。
 
可用于检索属性的函数
- C2DPushGraph::GetBGColor- COLORREF GetBGColor() const
- C2DPushGraph::GetGridColor- COLORREF GetGridColor() const
- C2DPushGraph::GetGridSize- int GetGridSize() const 
- C2DPushGraph::GetInterval- unsigned short GetInterval() const 
- C2DPushGraph::GetLabelForMax- LPCTSTR GetLabelForMax() const
- C2DPushGraph::GetLabelForMin- LPCTSTR GetLabelForMin() const
- C2DPushGraph::GetLineColor- COLORREF GetLineColor( UINT uiLineID ) - UiLineID:线的 ID。
 
- C2DPushGraph::GetMaxPeek- int GetMaxPeek() const 
- C2DPushGraph::GetMinPeek- int GetMinPeek() const 
- C2DPushGraph::GetTextColor- COLORREF GetTextColor() const
联系作者
Stuart Konen 电子邮件地址:skonen@gmail.com
快速问候:我目前正在寻找工作,并接受合同。
历史
- 2005年4月14日 - 开始开发 `C2DPushGraph`。
- 2005年4月20日 - 向 The Code Project 提交了 `C2DPushGraph`。
