接《【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);
函数的具体实现
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(); // 删除新画笔
}