📄 canvasframe.cpp
字号:
//canvasFrame.cpp : implementation file
//
#include "stdafx.h"
#include "canvasr.h"
#include "canvasFrame.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// canvasFrame
IMPLEMENT_DYNCREATE(canvasFrame, CFrameWnd)
LPDIRECTSOUND pDS; //声明DirectSound 对象指针
LPDIRECTSOUNDBUFFER pPBuf; //声明主缓冲区指标
LPDIRECTSOUNDBUFFER pSBuf; //声明次缓冲区
LPDIRECTSOUND3DBUFFER Buffer3D;
LPDIRECTSOUND3DLISTENER Listener;
WAVEFORMATEX pwfmt; //声明声音结构
WAVEFORMATEX swfmt; //声明声音结构
DSBUFFERDESC dsdesc; //声明描述结构
MMCKINFO ckRiff; //RIFF 区块的信息
MMCKINFO ckInfo; //子区块的信息
MMRESULT mmresult; //返回结果
HMMIO hmmio; //打开的多媒体文件
DWORD size; //实际数据大小
HRESULT result; //声明HRESULT类型变量
LPVOID pAudio;
DWORD bytesAudio;
double xvector,yvector;
int xnow,ynow,xlast,ylast,i,c,xp;
canvasFrame::canvasFrame()
{
Create(NULL,"绘图窗口");
CClientDC dc(this);
int width = dc.GetDeviceCaps(HORZRES);
int height = dc.GetDeviceCaps(VERTRES);
GetWindowRect( &rect );
width = ( width - ( rect.right - rect.left ))/2 ;
height = (height - (rect.bottom - rect.top ))/2 ;
MoveWindow( width , height , (rect.right - rect.left ) , (rect.bottom - rect.top ) ,true);
mdc = new CDC;
mdc->CreateCompatibleDC(&dc);
char str[7];
for(i=0;i<4;i++)
{
sprintf(str,"m%d.bmp",i);
m[i] = new CBitmap;
m[i]->m_hObject = (HBITMAP)::LoadImage(NULL,str,IMAGE_BITMAP,440,74,LR_LOADFROMFILE);
sprintf(str,"p%d.bmp",i);
p[i] = new CBitmap;
p[i]->m_hObject = (HBITMAP)::LoadImage(NULL,str,IMAGE_BITMAP,440,74,LR_LOADFROMFILE);
}
CPoint *p = new CPoint(250,150); //设定起始坐标
ClientToScreen(p); //转换坐标
::SetCursorPos(p->x,p->y); //设定鼠标所在位置
ShowCursor(false);
pSBuf->Play(0,0,1);
delete p;
}
canvasFrame::~canvasFrame()
{
if(mdc) delete mdc; //释放资源
for(i=0;i<=3;i++)
{
if(p[i]) delete p[i]; //释放资源
if(m[i]) delete m[i]; //释放资源
}
Listener->Release();
pSBuf->Release();
pDS->Release();
}
BEGIN_MESSAGE_MAP(canvasFrame, CFrameWnd)
//{{AFX_MSG_MAP(canvasFrame)
ON_WM_MOUSEMOVE()
ON_WM_CHAR()
ON_WM_CREATE()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// canvasFrame message handlers
void canvasFrame::OnMouseMove(UINT nFlags, CPoint point)
{
CClientDC dc(this);
xlast = xnow; //上一次的 X 坐标
ylast = ynow; //上一次的 Y 坐标
xnow = point.x; //此次的 X 坐标
ynow = point.y; //此次的 Y 坐标
c++;
if(c==8)
c=0;
xp=55*c;
mdc->SelectObject(m[1]);
dc.BitBlt(xlast,ylast,55,74,mdc,0,0,WHITENESS); //覆盖上一次的贴图
if(fabs(xnow-xlast) >= fabs(ynow-ylast))
{
if(xnow-xlast>=0) //往右
{
mdc->SelectObject(m[1]); //贴上人物
dc.BitBlt(point.x,point.y,55,74,mdc,xp,0,SRCAND);
mdc->SelectObject(p[1]);
dc.BitBlt(point.x,point.y,55,74,mdc,xp,0,SRCPAINT);
}
else //往左
{
mdc->SelectObject(m[2]);
dc.BitBlt(point.x,point.y,55,74,mdc,xp,0,SRCAND);
mdc->SelectObject(p[2]);
dc.BitBlt(point.x,point.y,55,74,mdc,xp,0,SRCPAINT);
}
}
else
{
if(ynow-ylast >= 0) //往下
{
mdc->SelectObject(m[3]);
dc.BitBlt(point.x,point.y,55,74,mdc,xp,0,SRCAND);
mdc->SelectObject(p[3]);
dc.BitBlt(point.x,point.y,55,74,mdc,xp,0,SRCPAINT);
}
else //往上
{
mdc->SelectObject(m[0]);
dc.BitBlt(point.x,point.y,55,74,mdc,xp,0,SRCAND);
mdc->SelectObject(p[0]);
dc.BitBlt(point.x,point.y,55,74,mdc,xp,0,SRCPAINT);
}
}
xvector = (xnow-250)/50*0.5;
yvector = (ynow-150)/50*0.5;
Listener->SetPosition(xvector,yvector,0,DS3D_IMMEDIATE);
char str[40];
sprintf(str,"目前倾听者的位置:(%.1f,%.1f,0) ",xvector,yvector);
dc.TextOut(0,0,str);
CFrameWnd::OnMouseMove(nFlags, point);
}
void canvasFrame::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: Add your message handler code here and/or call default
if( nChar== VK_ESCAPE)
PostMessage(WM_CLOSE ); //传送WM_CLOSE信息
CFrameWnd::OnChar(nChar, nRepCnt, nFlags);
}
int canvasFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
result = DirectSoundCreate( NULL, &pDS, NULL ); //建立 DirectSound 对象
if(result != DS_OK)
MessageBox("建立 DirectSound 对象失败!");
result = pDS->SetCooperativeLevel( m_hWnd, DSSCL_PRIORITY );
if(result != DS_OK)
MessageBox("设定协调层级失败!");
memset( &dsdesc,0, sizeof(dsdesc) ); //清空结构内容
dsdesc.dwSize = sizeof(dsdesc); //配置描述结构大小
dsdesc.dwFlags = DSBCAPS_PRIMARYBUFFER|DSBCAPS_CTRL3D;
dsdesc.dwBufferBytes = 0;
dsdesc.lpwfxFormat = NULL;
result = pDS->CreateSoundBuffer( &dsdesc, &pPBuf, NULL );
if(result != DS_OK)
MessageBox("建立主缓冲区失败!");
memset( &pwfmt,0, sizeof(pwfmt) );
pwfmt.wFormatTag = WAVE_FORMAT_PCM;
pwfmt.nChannels = 2; //播放声道
pwfmt.nSamplesPerSec = 44100; //播放频率
pwfmt.wBitsPerSample = 16; //位
pwfmt.nBlockAlign = pwfmt.wBitsPerSample / 8 * pwfmt.nChannels;
pwfmt.nAvgBytesPerSec = pwfmt.nSamplesPerSec * pwfmt.nBlockAlign;
result = pPBuf->SetFormat(&pwfmt); //设定播放格式
if(result != DS_OK)
MessageBox("设定播放格式失败!");
result = pPBuf->QueryInterface( IID_IDirectSound3DListener, (VOID**)&Listener );
if(result != DS_OK)
MessageBox("建立倾听者失败!");
pPBuf->Release();
hmmio = mmioOpen("s0.wav", NULL, MMIO_ALLOCBUF|MMIO_READ );
//打开文件
if(hmmio == NULL) //判断是否为空
MessageBox("文件不存在!");
ckRiff.fccType = mmioFOURCC('W', 'A', 'V', 'E');
//设定文件类型
mmresult = mmioDescend(hmmio,&ckRiff,NULL,MMIO_FINDRIFF);
//搜寻类型
if(mmresult != MMSYSERR_NOERROR)
MessageBox("文件格式错误!");
ckInfo.ckid = mmioFOURCC('f','m','t',' '); //设定区块类型
mmresult = mmioDescend(hmmio,&ckInfo,&ckRiff,MMIO_FINDCHUNK);
//搜寻区块
if(mmresult != MMSYSERR_NOERROR)
MessageBox("文件格式错误!");
if(mmioRead(hmmio,(HPSTR)&swfmt,sizeof(swfmt)) == -1) //读取文件格式
MessageBox("读取格式失败!");
mmresult = mmioAscend(hmmio,&ckInfo,0); //跳出子区块
ckInfo.ckid = mmioFOURCC('d','a','t','a'); //设定区块类型
mmresult = mmioDescend(hmmio,&ckInfo,&ckRiff,MMIO_FINDCHUNK);
//搜寻区块
if(mmresult != MMSYSERR_NOERROR)
MessageBox("文件格式错误!");
size = ckInfo.cksize; //取得实际资料大小
memset( &dsdesc,0,sizeof(dsdesc)); //清空结构内容
dsdesc.dwSize = sizeof(dsdesc); //配置结构大小
dsdesc.dwFlags = DSBCAPS_STATIC |DSBCAPS_CTRLPAN |DSBCAPS_CTRLVOLUME| DSBCAPS_GLOBALFOCUS|DSBCAPS_CTRL3D;
dsdesc.dwBufferBytes = size; //设定缓冲区大小
dsdesc.lpwfxFormat = &swfmt; //设定缓冲区格式
result = pDS->CreateSoundBuffer( &dsdesc, &pSBuf, NULL );
if(result != DS_OK)
MessageBox("建立次缓冲区失败!");
result = pSBuf->Lock(0,size,&pAudio,&bytesAudio,NULL,NULL,NULL);
//锁定缓冲区
if(result != DS_OK)
MessageBox("锁定缓冲区失败!");
mmresult = mmioRead(hmmio,(HPSTR)pAudio,bytesAudio);
//读取音文件数据
if(mmresult == -1)
MessageBox("读取音文件数据失败!");
result = pSBuf->Unlock(pAudio,bytesAudio,NULL,NULL);
//解除锁定缓冲区
if(result != DS_OK)
MessageBox("解除锁定缓冲区失败!");
mmioClose(hmmio,0);
result = pSBuf->QueryInterface( IID_IDirectSound3DBuffer, (VOID**)&Buffer3D );
if(result != DS_OK)
MessageBox("建立 3D 缓冲区失败!");
// TODO: Add your specialized creation code here
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -