// WavePlayerView.cpp : CWavePlayerView 类的实现
//
#include "stdafx.h"
#include "WavePlayer.h"
#include "WavePlayerDoc.h"
#include "WavePlayerView.h"
#include<cmath> // double pow(double, double);
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// CWavePlayerView
IMPLEMENT_DYNCREATE(CWavePlayerView, CView)
BEGIN_MESSAGE_MAP(CWavePlayerView, CView)
// 标准打印命令
ON_COMMAND(ID_FILE_PRINT, &CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, &CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, &CView::OnFilePrintPreview)
END_MESSAGE_MAP()
// CWavePlayerView 构造/析构
CWavePlayerView::CWavePlayerView()
{
// TODO: 在此处添加构造代码
}
CWavePlayerView::~CWavePlayerView()
{
}
BOOL CWavePlayerView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: 在此处通过修改
// CREATESTRUCT cs 来修改窗口类或样式
return CView::PreCreateWindow(cs);
}
// CWavePlayerView 绘制
void CWavePlayerView::OnDraw(CDC* /*pDC*/)
{
CWavePlayerDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
//////////////////////////////////////////////////////////////////////////
CDC *pDC = new CClientDC(this);
CRect rect; // 客户区大小
GetClientRect(&rect);
CPen gpen(PS_SOLID, 1, RGB(0, 250, 0)); // 绿色笔
pDC->SelectObject(&gpen);
if(pDoc->data!=NULL || pDoc->Ldata!=NULL) // 数据非空时才画
{
float A=pow(2.0, 8.0*pDoc->BytesPerSample-1); // 将样本的高度映射到所需高度,
// 先算出样本的最大值
if(pDoc->wChannel==1) // 单声道
{
int x=0, y=rect.Height()/2;
while(x < rect.Width())
{
int min=INT_MAX, max=INT_MAX+1; // 让min初始为最大的int, 让max初始化最小的int
// 一个象素x映射(样本数/客户区宽度)个样本点, 用其中最大最小值, 画一竖直的线段
for(int j=x*pDoc->num/rect.Width(); j<(x+1)*pDoc->num/rect.Width(); j++)
{
if(pDoc->data[j]<min)
min=pDoc->data[j];
if(pDoc->data[j]>max)
max=pDoc->data[j];
}
pDC->MoveTo(x, y+(max*rect.Height()/2.0/A));
pDC->LineTo(x, y+(min*rect.Height()/2.0/A));
x++;
}
CPen pen(PS_SOLID, 1, RGB(200, 0, 0)); // 客户区中间画一横线
pDC->SelectObject(&pen);
pDC->MoveTo(0, rect.Height()/2);
pDC->LineTo(rect.Width(), rect.Height()/2);
}
else if(pDoc->wChannel==2)
{
// 在客户区上半部分画左声道, 原理同单声道,
int x=0, y=rect.Height()/4;
while(x<rect.Width())
{
int min=INT_MAX, max=INT_MAX+1;
for(int j=x*pDoc->num/2/rect.Width(); j<(x+1)*pDoc->num/2/rect.Width(); j++)
{
if(pDoc->Ldata[j]<min)
min=pDoc->Ldata[j];
if(pDoc->Ldata[j]>max)
max=pDoc->Ldata[j];
}
pDC->MoveTo(x, y+(max*rect.Height()/4.0/A));
pDC->LineTo(x, y+(min*rect.Height()/4.0/A));
x++;
}
// 在客户区下半部分画右声道
x=0, y=3*rect.Height()/4;
while(x<rect.Width())
{
int min=INT_MAX, max=INT_MAX+1;
for(int j=x*pDoc->num/2/rect.Width(); j<(x+1)*pDoc->num/2/rect.Width(); j++)
{
if(pDoc->Rdata[j]<min)
min=pDoc->Rdata[j];
if(pDoc->Rdata[j]>max)
max=pDoc->Rdata[j];
}
gpen.DeleteObject();
gpen.CreatePen(PS_SOLID, 1, RGB(255, 0, 0));
pDC->SelectObject(&gpen);
pDC->MoveTo(x, y+(max*rect.Height()/4.0/A));
pDC->LineTo(x, y+(min*rect.Height()/4.0/A));
x++;
}
// 画客户区中央横线
CPen pen(PS_SOLID, 1, RGB(0, 0, 0));
pDC->SelectObject(&pen);
pDC->MoveTo(0, rect.Height()/2);
pDC->LineTo(rect.Width(), rect.Height()/2);
pen.DeleteObject();
pen.CreatePen(PS_SOLID, 1, RGB(0, 0, 255));
pDC->SelectObject(&pen);
// 画左声道横线
pDC->MoveTo(0, rect.Height()/4);
pDC->LineTo(rect.Width(), rect.Height()/4);
// 右声道横线
pDC->MoveTo(0, 3*rect.Height()/4);
pDC->LineTo(rect.Width(), 3*rect.Height()/4);
}
}
//////////////////////////////////////////////////////////////////////////
}
// CWavePlayerView 打印
BOOL CWavePlayerView::OnPreparePrinting(CPrintInfo* pInfo)
{
// 默认准备
return DoPreparePrinting(pInfo);
}
void CWavePlayerView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: 添加额外的打印前进行的初始化过程
}
void CWavePlayerView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: 添加打印后进行的清理过程
}
// CWavePlayerView 诊断
#ifdef _DEBUG
void CWavePlayerView::AssertValid() const
{
CView::AssertValid();
}
void CWavePlayerView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
CWavePlayerDoc* CWavePlayerView::GetDocument() const // 非调试版本是内联的
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CWavePlayerDoc)));
return (CWavePlayerDoc*)m_pDocument;
}
#endif //_DEBUG
// CWavePlayerView 消息处理程序
- 1
- 2
- 3
- 4
- 5
- 6
前往页