【MFC笔记】通过读取TXT中的数据绘制波形图

时间:2024-03-30 07:20:01

接《【MFC笔记】GDI对象之画笔CPen画波形图

1、创建一个基于对话框的MFC工程。

2、添加一个Picture控件,ID设为IDC_WAVE_DRAW。 

3、为Picture控件添加CStatic变量,名称设为m_picDraw。

4、在文件XXXXDlg.h文件中添加宏定义:#define POINT_COUNT 200 //显示的波形的长度,后面改成长度根据数组长度

5、在XXXXDlg.h文件中为XXXXDlg类添加成员数组。DOUBLE m_nzValues[POINT_COUNT];用于存储数据

 

6、将波形数据读取到数组中,文件打开模块参考《【MFC笔记】文件打开对话框和将数据保存到列表控件》

void CMFCApplication7Dlg::OnBnClickedOk()//打开文件按钮按下
{
    TCHAR szFilter[] = _T("文本文件(*.txt)|*.txt|所有文件(*.*)|*.*||");//文件过滤器

    CFileDialog fileDlg(TRUE, _T("txt"), NULL, 0, szFilter, this);    /*创建打开文件对话框*/

    if (IDOK == fileDlg.DoModal())//打开对话框关闭成功
    {
        CStdioFile MyFile;//创建文件实体
        MyFile.Open(fileDlg.GetPathName(), CFile::modeRead);//打开文件,只读

        CString srtbuf;//接收数据的缓存
        for (int i = 0; i < POINT_COUNT && MyFile.ReadString(srtbuf); i++)//存储数组用完或者读取到文件尾
        {            m_nzValues[i] = _ttof(srtbuf);        }//字符串转为double
        CRect rectPicture;
        m_picDraw.GetClientRect(&rectPicture);//把picture的控件尺寸付给rectPicture对象,传递给以便DrawWave
        DrawWave(m_picDraw.GetDC(), rectPicture);

    }
}

 

7、为XXXXDlg类添加一个成员函数

    void XXXXDlg::DrawWave(CDC *pDC, CRect &rectPicture);

【MFC笔记】通过读取TXT中的数据绘制波形图

函数的具体实现

void CMFCApplication7Dlg::DrawWave(CDC *pDC, CRect &rectPicture)
{
    float fDeltaX;     // x轴相邻两个绘图点的坐标距离   
    float fDeltaY;     // y轴每个逻辑单位对应的坐标值   
    int nX;      // 在连线时用于存储绘图点的横坐标   
    int nY;      // 在连线时用于存储绘图点的纵坐标   
    CPen newPen;       // 用于创建新画笔   
    CPen *pOldPen;     // 用于存放旧画笔   
    CBrush newBrush;   // 用于创建新画刷   
    CBrush *pOldBrush; // 用于存放旧画刷   

    // 计算fDeltaX和fDeltaY   
    fDeltaX = (float)rectPicture.Width() / (POINT_COUNT - 1);
    fDeltaY = (float)rectPicture.Height() / 1;

    newBrush.CreateSolidBrush(RGB(0, 0, 0)); // 创建黑色新画刷
    pOldBrush = pDC->SelectObject(&newBrush);// 选择新画刷,并将旧画刷的指针保存到pOldBrush   
    pDC->Rectangle(rectPicture);    // 以黑色画刷为绘图控件填充黑色,形成黑色背景   
    pDC->SelectObject(pOldBrush);    // 恢复旧画刷
    newBrush.DeleteObject();    // 删除新画刷


    newPen.CreatePen(PS_SOLID, 1, RGB(0, 255, 0));    // 创建实心画笔,粗度为1,颜色为绿色
    pOldPen = pDC->SelectObject(&newPen);    // 选择新画笔,并将旧画笔的指针保存到pOldPen

    pDC->MoveTo(rectPicture.left, rectPicture.bottom);    // 将当前点移动到绘图控件窗口的左下角,以此为波形的起始点   
    for (int i = 0; i < POINT_COUNT; i++)    // 计算m_nzValues数组中每个点对应的坐标位置,并依次连接,最终形成曲线   
    {
        nX = rectPicture.left + (int)(i * fDeltaX);
        nY = rectPicture.Height()/2 - (int)(m_nzValues[i] * fDeltaY);
        pDC->LineTo(nX, nY);
    }

    pDC->SelectObject(pOldPen);    // 恢复旧画笔   
    newPen.DeleteObject();    // 删除新画笔   
}

【MFC笔记】通过读取TXT中的数据绘制波形图