📄 childview.cpp
字号:
// ChildView.cpp : implementation of the CChildView class
//
#include "stdafx.h"
#include "Vib.h"
//#include "ChildView.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CChildView
CChildView::CChildView()
{
m_hWaveIn=NULL;
m_bRestart=FALSE;
}
CChildView::~CChildView()
{
}
BEGIN_MESSAGE_MAP(CChildView,CWnd)
//{{AFX_MSG_MAP(CChildView)
ON_WM_PAINT()
ON_WM_CREATE()
ON_MESSAGE(MM_WIM_DATA,OnMM_WIM_DATA)
ON_MESSAGE(MM_WIM_CLOSE,OnMM_WIM_CLOSE)
ON_MESSAGE(MM_WOM_OPEN,OnMM_WOM_OPEN)
ON_MESSAGE(MM_WOM_DONE,OnMM_WOM_DONE)
ON_MESSAGE(MM_WOM_CLOSE,OnMM_WOM_CLOSE)
ON_WM_DESTROY()
ON_COMMAND(ID_FILE_ENVELOP, OnFileEnvelop)
ON_COMMAND(ID_FILE_PAUSE, OnFilePause)
ON_UPDATE_COMMAND_UI(ID_FILE_PAUSE, OnUpdateFilePause)
//}}AFX_MSG_MAP
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT_PREVIEW, OnFilePrintPreview)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CChildView message handlers
BOOL CChildView::PreCreateWindow(CREATESTRUCT& cs)
{
if (!CWnd::PreCreateWindow(cs))
return FALSE;
cs.dwExStyle |= WS_EX_CLIENTEDGE;
cs.style &= ~WS_BORDER;
cs.lpszClass = AfxRegisterWndClass(CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS,
::LoadCursor(NULL, IDC_ARROW), HBRUSH(COLOR_WINDOW+1), NULL);
return TRUE;
}
void CChildView::OnPaint()
{
// TODO: Add your message handler code here
CPaintDC dc(this); // device context for painting
CRect rectClient;
GetClientRect(&rectClient);
theApp.DrawWave(&dc,rectClient);
return;
}
int CChildView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CWnd ::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: Add your specialized creation code here
theApp.m_pView=this;
StartWave();
return 0;
}
void CChildView::OnMM_WIM_DATA(UINT wParam,LONG lParam)
{
static DWORD nTickEnd=0;
if(::GetTickCount()<nTickEnd)StopWave(TRUE);
else if(m_hWaveIn)
{
PWAVEHDR pHdr=(PWAVEHDR)lParam;
PSHORT pData=(PSHORT)pHdr->lpData;
int nSize=pHdr->dwBytesRecorded/2;
::waveInAddBuffer(m_hWaveIn,pHdr,sizeof (WAVEHDR));
if(!theApp.m_bPause)
{
theApp.ReadWave(pData,nSize);
Invalidate(FALSE);
}
nTickEnd=::GetTickCount()+10;
}
}
void CChildView::OnMM_WIM_CLOSE(UINT wParam,LONG lParam)
{
//MessageBox("WinClose");
}
void CChildView::OnMM_WOM_OPEN(UINT wParam,LONG lParam)
{
MessageBox("WomOpen");
}
void CChildView::OnMM_WOM_DONE(UINT wParam,LONG lParam)
{
MessageBox("WomDone");
}
void CChildView::OnMM_WOM_CLOSE(UINT wParam,LONG lParam)
{
MessageBox("WomClose");
}
void CChildView::OnDestroy()
{
CWnd ::OnDestroy();
// TODO: Add your message handler code here
//StopWave();
}
void CChildView::StartWave(BOOL bRestart)
{
if(!bRestart)
{
m_WaveInHdr1=new WAVEHDR;
m_WaveInHdr2=new WAVEHDR;
m_pWaveInBuffer1=new BYTE[theApp.m_nFFTPoint*2];
m_pWaveInBuffer2=new BYTE[theApp.m_nFFTPoint*2];
m_WaveformIn.wFormatTag=WAVE_FORMAT_PCM;
m_WaveformIn.wBitsPerSample=16;
m_WaveformIn.cbSize=0;
m_WaveformIn.nChannels=1;
m_WaveformIn.nSamplesPerSec=theApp.m_nSampleFreq;//采样频率
m_WaveformIn.nBlockAlign=m_WaveformIn.nChannels*m_WaveformIn.wBitsPerSample/8;
m_WaveformIn.nAvgBytesPerSec=m_WaveformIn.nSamplesPerSec*m_WaveformIn.nBlockAlign;
m_WaveInHdr1->dwBufferLength=theApp.m_nFFTPoint*2;
m_WaveInHdr1->dwBytesRecorded=0;
m_WaveInHdr1->dwUser=0;
m_WaveInHdr1->dwFlags=0;
m_WaveInHdr1->dwLoops=1;
m_WaveInHdr1->lpNext=NULL;
m_WaveInHdr1->reserved=0;
*m_WaveInHdr2=*m_WaveInHdr1;
m_WaveInHdr1->lpData=(LPTSTR)m_pWaveInBuffer1;
m_WaveInHdr2->lpData=(LPTSTR)m_pWaveInBuffer2;
}
//打开录音设备函数
HWAVEIN hWaveIn=NULL;
MMRESULT s;
s=::waveInOpen(&hWaveIn,WAVE_MAPPER,&m_WaveformIn,(DWORD)m_hWnd,NULL,CALLBACK_WINDOW);
if(Msg(s))return;
s=::waveInPrepareHeader(hWaveIn,m_WaveInHdr1,sizeof(WAVEHDR));
if(Msg(s))return;
s=::waveInPrepareHeader(hWaveIn,m_WaveInHdr2,sizeof(WAVEHDR));
if(Msg(s))return;
s=::waveInAddBuffer(hWaveIn,m_WaveInHdr1,sizeof(WAVEHDR));
if(Msg(s))return;
s=::waveInAddBuffer(hWaveIn,m_WaveInHdr2,sizeof(WAVEHDR));
if(Msg(s))return;
s=::waveInStart(hWaveIn);
if(Msg(s))return;
m_hWaveIn=hWaveIn;
}
void CChildView::StopWave(BOOL bRestart)
{
if(m_hWaveIn)
{
HWAVEIN hWaveIn=m_hWaveIn;
MMRESULT s;
m_hWaveIn=NULL;
s=::waveInReset(hWaveIn);
if(Msg(s))return;
s=::waveInStop(hWaveIn);
if(Msg(s))return;
s=::waveInUnprepareHeader(hWaveIn, m_WaveInHdr1, sizeof(WAVEHDR));
if(Msg(s))return;
s=::waveInUnprepareHeader(hWaveIn, m_WaveInHdr2, sizeof(WAVEHDR));
if(Msg(s))return;
s=::waveInClose(hWaveIn);
if(Msg(s))return;
if(!bRestart)
{
delete[] m_WaveInHdr1;
delete[] m_WaveInHdr2;
delete[] m_pWaveInBuffer1;
delete[] m_pWaveInBuffer2;
}
else m_bRestart=TRUE;
}
}
BOOL CChildView::Msg(MMRESULT s)
{
if(s!=MMSYSERR_NOERROR)
{
int nCnt=256;
TCHAR szText[256];
::waveInGetErrorText(s,szText,nCnt);
MessageBox(szText);
return TRUE;
}
return FALSE;
}
void CChildView::OnFilePrintPreview()
{
// TODO: Add your command handler code here
//CView::OnFilePrintPreview();
}
void CChildView::OnFileEnvelop()
{
// TODO: Add your command handler code here
CEnvelop dlg;
dlg.DoModal();
}
void CChildView::OnFilePause()
{
// TODO: Add your command handler code here
theApp.SetPause(!theApp.m_bPause);
}
void CChildView::OnUpdateFilePause(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->SetCheck(theApp.m_bPause);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -