大斌子ggb 2024-04-22 14:38 采纳率: 0%
浏览 2

TeeChart Pro v5 ActiveX Control图表中标记某一个点,在特定位置进行标记

TeeChart Pro v5 ActiveX Control中标记某一个点

img

在MFC中使用了TeeChart Pro v5 ActiveX Control图表控件,例如在这样的表中怎么对曲线上的某个点进行标记呢

  • 写回答

6条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-04-22 14:38
    关注

    引自免费微信小程序:皆我百晓生

    在TeeChart Pro v5 ActiveX Control中,你可以通过创建一个新的Point对象并将其添加到图表的系列中来标记曲线上的某个点。以下是一个C++ MFC应用程序中的示例代码,展示了如何在曲线上的特定X坐标处添加一个标记点,并设置其标签和图标。

    首先,确保你的MFC项目已经包含了TeeChart的相关头文件,并且已经在资源视图中添加了TeeChart控件(通常命名为m_tChartCtrl)。

    #include "TeeChart.h"
    #include "TCustomAnnotation.h"
    
    // 在你的类定义中,例如CMyDialog类
    class CMyDialog : public CDialogEx
    {
    public:
        CMyDialog(CWnd* pParent = nullptr);   // 标准构造函数
    
    private:
        CArray<double, double> m_dataX;  // X轴数据
        CArray<double, double> m_dataY;  // Y轴数据
        CTeeChartCtrl m_tChartCtrl;       // TeeChart控件
    
    protected:
        virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持
    
        DECLARE_MESSAGE_MAP()
    
    public:
        afx_msg void OnBnClickedButtonAddMarker();
    };
    
    // 实现部分
    BEGIN_MESSAGE_MAP(CMyDialog, CDialogEx)
        ON_BN_CLICKED(IDC_BUTTON_ADD_MARKER, &CMyDialog::OnBnClickedButtonAddMarker)
    END_MESSAGE_MAP()
    
    CMyDialog::CMyDialog(CWnd* pParent /*=nullptr*/)
        : CDialogEx(CMyDialog::IDD, pParent)
    {
        // 初始化数据
        for (int i = 0; i < 10; ++i)
        {
            m_dataX.Add(i);
            m_dataY.Add(rand() % 100 + 50);
        }
    
        // 创建并初始化图表
        m_tChartCtrl.Create(TCHART_CLASS_NAME, WS_CHILD | WS_VISIBLE, CRect(10, 10, 300, 200), this);
    
        // 添加Y轴
        CTickmarks* tickmarks = new CTickmarks(m_tChartCtrl);
        tickmarks->AutoFit = false;
        tickmarks->Max = 100;
        tickmarks->Min = 0;
        tickmarks->Step = 20;
    
        // 创建并添加曲线
        CLineSeries* series = new CLineSeries(m_tChartCtrl);
        series->Title = _T("Data");
        series->FillSampleValues();
    
        // 将数据绑定到曲线
        for (size_t i = 0; i < m_dataX.GetSize(); ++i)
        {
            series->AddXY(m_dataX[i], m_dataY[i]);
        }
    }
    
    void CMyDialog::DoDataExchange(CDataExchange* pDX)
    {
        CDialogEx::DoDataExchange(pDX);
        DDX_Control(pDX, IDC_TEECHARTCTRL1, m_tChartCtrl);
    }
    
    void CMyDialog::OnBnClickedButtonAddMarker()
    {
        // 获取用户输入的X坐标
        double xCoord;
        if (CDlgHelper::GetDouble(NULL, _T("Enter X coordinate to mark"), _T("X Coordinate"), xCoord))
        {
            // 找到最接近的X坐标索引
            int index = FindNearestIndex(xCoord, m_dataX);
            
            // 如果找到,添加标记点
            if (index != -1)
            {
                CPoint point;
                m_tChartCtrl.GetAxis(Axis::Left)->ToScreen(m_dataY[index], point.y);
                m_tChartCtrl.GetAxis(Axis::Bottom)->ToScreen(xCoord, point.x);
    
                // 创建并设置标记点
                CCustomAnnotation* annotation = new CCustomAnnotation(m_tChartCtrl);
                annotation->Text = _T("ROI4");
                annotation->Position = Point(point.x, point.y);
                annotation->Icon = Icon::Diamond;
                annotation->Color = clRed;
                annotation->FontFaceName = _T("Arial");
                annotation->FontSize = 8;
                annotation->Visible = true;
    
                // 添加到图表上
                m_tChartCtrl.Annotations()->Add(annotation);
            }
            else
            {
                AfxMessageBox(_T("No data point found at the specified X coordinate."));
            }
        }
    }
    
    int CMyDialog::FindNearestIndex(double value, const CArray<double, double>& array)
    {
        int index = -1;
        double minDiff = std::numeric_limits<double>::max();
    
        for (size_t i = 0; i < array.GetSize(); ++i)
        {
            double diff = std::abs(value - array[i]);
            if (diff < minDiff)
            {
                minDiff = diff;
                index = static_cast<int>(i);
            }
        }
    
        return index;
    }
    

    在这个例子中,我们首先创建了一个简单的线形图,并将一些随机数据添加到曲线上。然后,当用户点击按钮时,程序会提示用户输入要标记的X坐标。程序会找到最接近这个坐标的点,并在该点上方显示一个带有"ROI4"标签的红色钻石形状标记。如果你想要在特定的位置而不是根据X值来添加标记,只需调整OnBnClickedButtonAddMarker函数中的逻辑即可。

    注意:这段代码可能需要与你的具体项目结构结合,因此可能需要适当的调整。此外,由于TeeChart API的具体实现可能会随着版本更新而变化,所以请确保参考最新的TeeChart文档以获取最新信息。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 4月22日

悬赏问题

  • ¥15 已知许多点位,想通过高斯分布来随机选择固定数量的点位怎么改
  • ¥15 怎么生成确定数目的泊松点过程
  • ¥15 layui数据表格多次重载的数据覆盖问题
  • ¥15 python点云生成mesh精度不够怎么办
  • ¥15 QT C++ 鼠标键盘通信
  • ¥15 改进Yolov8时添加的注意力模块在task.py里检测不到
  • ¥50 高维数据处理方法求指导
  • ¥100 数字取证课程 关于FAT文件系统的操作
  • ¥15 如何使用js实现打印时每页设置统一的标题
  • ¥15 安装TIA PortalV15.1报错