一个二维数据可视化类






4.54/5 (33投票s)
2000年3月21日

323916

17681
用于显示二维数据的全面类集
引言
CGraphWnd
是一个提供多图二维数据可视化的类。
CGraphWnd
类继承自 CWnd
MFC 类,可以用作不同类型二维数据绘图视图的基类。支持的功能包括:
- 常规和散点图模式
- 自动缩放
- 缩放
- 适应宽度、高度和页面
- 鼠标坐标跟踪
- 能够以每秒最多 15000 点的速度交互式添加和显示点(取决于计算机速度)
- 平移支持 - 按住 Shift 键并按下鼠标左键进行拖动
- 图表可以绘制在任何设备上下文中,包括打印机的设备上下文
请参见上面示例图片,其中包含一个带有 3 个图表的 2D 图
类接口。
类接口提供了几组函数
图表创建例程
CGraphWnd(long maximum_graphs = 32);
构造函数。创建图表并初始化绘图存储。maximum_graphs 参数指定图表的最大数量。
BOOL Create(LPCTSTR lpszWindowName, const RECT& rect, CWnd* pParentWnd, UINT nID,
DWORD dwStyle = WS_CHILD | WS_VISIBLE, BOOL bAutoUpdateTimer = FALSE);
该函数创建一个图表窗口。bAutoUpdateTimer 参数指定是否启动工具栏更新计时器,以处理 Idle 功能不可用(如模态对话框)的情况。有关其他参数的说明,请参见 MSDN 中关于 CWnd::Create
的帮助文档。
图表操作例程
virtual int AddGraph(COLORREF newColor = 0, char* title = "", BOOL bRedraw = TRUE, BOOL b_sort_x = TRUE, BOOL b_keep_same_x = FALSE);
该函数向视图添加新图表。成功时返回图表索引,否则返回 -1。如果设置了 bInvalidate 标志,则视图将更新。如果设置了 b_sort_x 标志,则点将按 X 轴排序。
virtual int RemoveGraph(int index, BOOL bRedraw = TRUE);
该函数从集合中删除图表。
virtual int UpdateGraph(int index, BOOL bRedraw = TRUE);
如果设置了 bInvalidate 标志,该函数将更新图表信息和视图。在对隐藏图表进行批量操作后很有用。
virtual CGraphProps* GetGraph(int index);
该函数返回给定图表的属性,如果出错则返回 NULL。
virtual CGraphProps* GetFirstGraph(int* index);
virtual CGraphProps* GetNextGraph(int* index);
这些函数用于遍历视图中的所有现有图表。
virtual void SetGraphFlags(DWORD new_flags, BOOL bRedraw);
virtual DWORD GetGraphFlags();
这些函数用于获取或设置图表视图标志。标志值是以下内容的 OR 组合:
enum GRAPH_PANEL_FLAGS { GRAPH_AUTOSCALE = 0x00000001, //turns autoscale feature on/off GRAPH_SQUAREPOINTS = 0x00000002, //defines whether to draw points as squares GRAPH_SHOW_TOOLTIP = 0x00000004, //defines whether to show tooltip with mouse coordinates information GRAPH_DRAW_AXIS = 0x00000008, //defines whether to draw axis GRAPH_GRAPH_SCATTER = 0x00000010 //specifies if graph is shown as "scatter" graph };
点操作例程
virtual int AddPoint(int graphnum, double x, double y, BOOL bRedraw, int index = -1);
向图表中添加(如果 index == -1)或插入新点。如果设置了 bRedraw,图表将被失效。
virtual int EditPoint(int graphnum, int index, double x, double y, BOOL bRedraw);
设置新点的坐标。如果设置了 bRedraw,则会使图表失效。
virtual int RemovePoint(int graphnum, int index, BOOL bRedraw);
从图表中删除点。
virtual void ClearGraph(int graphnum, BOOL bRedraw);
删除指定图表的所有点,或者删除所有图表(如果 graphnum == -1)。
坐标轴操作例程。
virtual void SetAxisProps(char* _title, char* _UOM, int _precision, BOOL bXAxis, BOOL bRedraw);
设置坐标轴的属性。属性包括:坐标轴的标题(_title)、测量单位(_UOM)和精度 - 小数点后的位数(_precision)。bXAxis 参数指定要应用属性的坐标轴,可以是以下之一:GRAPH_X_AXIS 或 GRAPH_Y_AXIS。
virtual void FormatAxisOutput(double value, BOOL bXAxis, int format_level, CString& res_str);
根据当前的坐标轴属性和格式级别,返回格式化后的 value 参数。目前定义了三种格式级别:
0 - 最少信息。
1 - 值和测量单位
2 - 坐标轴标题、值和测量单位
坐标轴世界坐标。
virtual void SetGraphWorldCoords(double x1, double x2, double y1, double y2, BOOL bRedraw = TRUE);
该函数设置图表的新世界坐标,如果设置了 bRedraw 标志,则重绘图表。
virtual void GetGraphWorldCoords(double* x1, double* x2, double* y1, double* y2);
该函数检索图表的世界坐标。
virtual BOOL GetBoundRect(double* minx, double* maxx, double* miny, double* maxy);
该函数检索所有可见图表的边界矩形。
杂项操作。
virtual void UpdateWindows(unsigned long what_to_update);
该函数更新(重绘)指定的视图和/或窗口。what_to_update 参数可以是以下值的 OR 组合:
enum GRAPH_WINDOW_UPDATE_VALUES { GRAPH_WUV_GRAPH = 0x00000001, GRAPH_WUV_PVIEW = 0x00000002, GRAPH_WUV_RULERS = 0x00000004, GRAPH_WUV_ALL = 0xFFFFFFFF };
virtual void OperateWithPointView(unsigned long pview_operations);
该函数执行以下点视图操作:
- 显示视图 - 在最新的可见位置显示视图
- 隐藏视图 - 隐藏点视图
- 禁用视图 - 点视图不会被任何点信息(添加/删除/编辑点)更新
- 启用视图 - 使点视图能够跟踪点更改操作
pview_operations 参数可以是以下值之一:
enum GRAPH_PVIEW_OPERATIONS { GRAPH_PO_SHOW = 0x00000001, GRAPH_PO_HIDE = 0x00000002, GRAPH_PO_DISABLE = 0x00000004, GRAPH_PO_ENABLE = 0x00000008 };
void DrawGraphToDC(CDC* dest_dc, CRect& rect_to_draw);
使用此函数可以在由 dest_dc 参数指定的设备上下文中绘制带有标尺的图表。rect_to_draw 参数定义了图表应绘制的像素矩形。
菜单和属性页操作。
virtual void AppendMenuItems(CMenu* menu);
重写此函数以更改右键菜单的内容。
virtual void AppendPropertyPage(CPropertySheet* prop_sheet);
重写此函数以将属性页添加到具有图表属性的属性表中。
virtual void ReleasePropertyPage(UINT dialog_status);
此函数应应用更改(如果有)并删除之前添加的属性页。dialog_status 参数是属性表 DoModal()
函数的结果(IDOK 或 IDCANCEL)。
类用法。
项目修改。
您需要在应用程序中使用此类,请遵循以下几个步骤:
- 将所有图表文件(grres.rc 和 grres.h 除外)包含到您的项目中。
- 打开 grres.rc 并将以下资源复制到您的项目资源中:
IDD_GRAPH_CHANGE_TITLE 对话框
IDD_GRAPH_AXIS_PROP_PAGE 对话框
IDD_GRAPH_GRAPH_PROP_PAGE 对话框
IDD_GRAPH_GRAPHICS_PROPS 对话框
- 为您的项目添加 /GR(启用 RTTI)编译器选项
从
CGraphWnd
派生您的窗口类,或直接使用它 - 这样就可以开始了!
在对话框中使用该类。
为了在对话框中使用此类,您无需进行任何特殊步骤,除非在模态对话框中使用。在这种情况下,您必须将 CGraphWnd::Create
函数中的 bAutoUpdateTimer 参数设置为 TRUE。
源代码、演示、更新和法律声明。
此类最新的源代码、演示和更新可在 这里找到。您可以向作者发送电子邮件:此处。
此类使用了 CSizingControlBar 类,该类由 Cristi Posea 编写。