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

一个二维数据可视化类

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.54/5 (33投票s)

2000年3月21日

viewsIcon

323916

downloadIcon

17681

用于显示二维数据的全面类集

  • 下载演示项目 - 305 Kb
  • 下载源文件 - 80 Kb
  • Sample Image - graph2d.gif

    引言

    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_AXISGRAPH_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)。

    类用法。

    项目修改。

    您需要在应用程序中使用此类,请遵循以下几个步骤:

    1. 将所有图表文件(grres.rc 和 grres.h 除外)包含到您的项目中。
    2. 打开 grres.rc 并将以下资源复制到您的项目资源中:

      IDD_GRAPH_CHANGE_TITLE 对话框
      IDD_GRAPH_AXIS_PROP_PAGE 对话框
      IDD_GRAPH_GRAPH_PROP_PAGE 对话框
      IDD_GRAPH_GRAPHICS_PROPS 对话框
    3. 为您的项目添加 /GR(启用 RTTI)编译器选项
    4. CGraphWnd 派生您的窗口类,或直接使用它 - 这样就可以开始了!

    在对话框中使用该类。

    为了在对话框中使用此类,您无需进行任何特殊步骤,除非在模态对话框中使用。在这种情况下,您必须将 CGraphWnd::Create 函数中的 bAutoUpdateTimer 参数设置为 TRUE。

    源代码、演示、更新和法律声明。

    此类最新的源代码、演示和更新可在 这里找到。您可以向作者发送电子邮件:此处

    此类使用了 CSizingControlBar 类,该类由 Cristi Posea 编写。

    © . All rights reserved.