//波形绘制函数
void DrawWave(FILE * WavFile,int SumPot)
{
//获取客户窗口大小位置
CWnd *LeftWnd = GetDlgItem(IDC_WAVEL);
CRect leftrect;
LeftWnd->GetClientRect(&leftrect);
CWnd *RightWnd = GetDlgItem(IDC_WAVER);
CRect rightrect;
RightWnd->GetClientRect(&rightrect);
int leftHeight = leftrect.Height(),leftWidth = leftrect.Width();
int rightHeight = rightrect.Height(),rightWidth = rightrect.Width();
//将客户窗口背景色设置为黑色
CClientDC leftdc(LeftWnd);
leftdc.FillSolidRect(&leftrect,RGB(0,0,0));
CClientDC rightdc(RightWnd);
rightdc.FillSolidRect(&rightrect,RGB(0,0,0));
//画中线,白色
CPen pen(PS_SOLID,0,RGB(255,255,255));
leftdc.SelectObject(&pen);
leftdc.MoveTo(0,leftHeight/2);
leftdc.LineTo(leftWidth,leftHeight/2);
rightdc.SelectObject(&pen);
rightdc.MoveTo(0,rightHeight/2);
rightdc.LineTo(rightWidth,rightHeight/2);
//选择绿色实线画笔,并将画笔移动到起点
pen.DeleteObject();
pen.CreatePen(PS_SOLID,1,RGB(0,255,0));
leftdc.SelectObject(&pen);
leftdc.MoveTo(0,leftHeight/2);
//申请内存空间,存放波形数据
SINT *pDataTemp = (SINT *)malloc(sizeof(SINT));
memset(pDataTemp,0,sizeof(SINT));
//画左声道波形
int xl,yl;
for(int i=0;i<SumPot;i++)
{
//读取波形数据进入内存临时空间
fseek(WavFile,44+i*4,SEEK_SET);
fread(pDataTemp,sizeof(SINT),1,WavFile);
//将波形数据存入数组中
leftData[i] = *pDataTemp + 32768;
//计算画图比例
yl = leftHeight/2*abs(*pDataTemp)/32768;
xl = leftWidth*i/SumPot;
if(*pDataTemp>=0)
leftdc.LineTo(xl,leftHeight/2-yl);
else
leftdc.LineTo(xl,leftHeight/2+yl);
}
//选择绿色画笔作为右声道图形颜色,并将画笔移动至起点
int xr,yr;
rightdc.SelectObject(&pen);
rightdc.MoveTo(0,rightHeight/2);
//画右声道波形
for(int i=0;i<SumPot;i++)
{
//读取波形数据进入内存临时空间
fseek(WavFile,46+i*4,SEEK_SET);
fread(pDataTemp,sizeof(SINT),1,WavFile);
//将波形数据存入数组中
rightData[i] = *pDataTemp + 32768;
//计算画图比例
yr= rightHeight/2*abs(*pDataTemp)/32768;
xr = rightWidth*i/SumPot;
if(*pDataTemp>=0)
rightdc.LineTo(xr,rightHeight/2-yr);
else
rightdc.LineTo(xr,rightHeight/2+yr);
}
free(pDataTemp);
}
参数说明:
WavFile是一个指向FILE文件类型的指针,可以用WavFile = fopen("文件路径","r")获得,SumPot是总采样点数,可以通过WAV文件头中的信息得到,函数中的IDC_WAVEL何IDC_WAVER分别是左右声道的绘图控件ID。
本代码在windows7下的VS2008编译环境中编译通过。