MFCpicture波形绘制

这里先吐槽一下CSDN,更新之后各种bug,复制的东西还不能撤销,删除还删不全,经常写着写着格式就出问题,网页还会死掉,然后又要重新写。完全不如以前的老版本,除了能复制图片,一无是处。不是我们不想写好文章,写好文章需要时间,你这样别人几个小时写好的文章被你这样一弄,谁还有兴趣写第二遍?

首先在界面上添加picture控件。
初始化
  // 以时间为种子来构造随机数生成器   
    srand((unsigned)time(NULL));   
  
    // 启动定时器,ID为1,定时时间为200ms   
    SetTimer(1, 200, NULL); 
通过类向导生成timer事件
void Cpicture绘制Dlg::OnTimer(UINT_PTR nIDEvent)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值

	CStatic *m_picDraw = (CStatic*)GetDlgItem(IDC_STATIC);   //加载图片控件  

	 CRect rectPicture;   
  
    // 将数组中的所有元素前移一个单位,第一个元素丢弃   
    for (int i=0; i<POINT_COUNT-1; i++)   
    {   
        m_nzValues[i] = m_nzValues[i+1];   
    }   
    // 为最后一个元素赋一个80以内的随机数值(整型)   
    m_nzValues[POINT_COUNT-1] = rand() % 80;   
  
    // 获取绘图控件的客户区坐标   
    // (客户区坐标以窗口的左上角为原点,这区别于以屏幕左上角为原点的屏幕坐标)   
    m_picDraw->GetClientRect(&rectPicture);   
  // this->GetClientRect(&rectPicture); 
    // 绘制波形图   
    drawwave(m_picDraw->GetDC(), rectPicture);   
   //drawwave(this->GetDC(), rectPicture); 
	CDialogEx::OnTimer(nIDEvent);
}
编写绘制函数
void Cpicture绘制Dlg::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() / 80;   
  
    // 创建黑色新画刷   
    newBrush.CreateSolidBrush(RGB(100,100,100));   
    // 选择新画刷,并将旧画刷的指针保存到pOldBrush   
    pOldBrush = pDC->SelectObject(&newBrush);   
    // 以黑色画刷为绘图控件填充黑色,形成黑色背景   
    pDC->Rectangle(rectPicture);   
    // 恢复旧画刷   
    pDC->SelectObject(pOldBrush);   
    // 删除新画刷   
    newBrush.DeleteObject();   
  
    // 创建实心画笔,粗度为1,颜色为绿色   
    newPen.CreatePen(PS_SOLID, 1, RGB(255,100,50));   
    // 选择新画笔,并将旧画笔的指针保存到pOldPen   
    pOldPen = pDC->SelectObject(&newPen);   
  
    // 将当前点移动到绘图控件窗口的左下角,以此为波形的起始点   
    pDC->MoveTo(rectPicture.left, rectPicture.bottom);   
    // 计算m_nzValues数组中每个点对应的坐标位置,并依次连接,最终形成曲线   
    for (int i=0; i<POINT_COUNT; i++)   
    {   
        nX = rectPicture.left -1+ (int)(i * fDeltaX);   
		
        nY = rectPicture.bottom -1- (int)(m_nzValues[i] * fDeltaY);   
        pDC->LineTo(nX, nY);   
    }   
  
    // 恢复旧画笔   
    pDC->SelectObject(pOldPen);   
    // 删除新画笔   
    newPen.DeleteObject();   

}

效果



MFC(Microsoft Foundation Class)是一个用于开发Windows应用程序的框架,它提供了一些类和函数库,方便开发者创建图形用户界面和处理各种任务。在MFC中实现音频波形显示,需要使用相关的类和函数库。 首先,需要使用MFC中的音频类来读取音频数据。可以使用CWaveFile类来打开音频文件,并使用其成员函数获取音频数据。然后,可以将获取到的音频数据进行处理,以便在波形显示中使用。 接下来,需要创建一个MFC窗口,并在窗口上进行波形绘制。可以使用CDC类中的相关函数来绘制波形图形。例如,可以使用LineTo函数来绘制波形的线条。 在绘制波形图的过程中,需要将音频数据与窗口上的像素点进行映射。可以根据音频数据的范围和窗口的尺寸,计算出音频数据在窗口上对应的坐标。 为了实现波形图的实时显示,可以使用定时器来定期更新窗口上的波形图形。可以使用SetTimer函数来设置定时器,然后在定时器触发的回调函数中进行波形的更新和绘制。 最后,可以根据需要对波形图进行美化,如设置线条的颜色、粗细等。 总的来说,通过使用MFC的相关类和函数,可以方便地实现音频波形的显示。需要利用音频类获取音频数据,使用CDC类绘制波形图形,并结合定时器实现实时显示。同时,可以根据需要对波形图进行美化,以提升用户体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值