⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fsmidi.cpp

📁 一款自已开发的贪吃蛇游戏
💻 CPP
字号:
// FsMidi.cpp: implementation of the CFsMidi class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "FsMidi.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CFsMidi::CFsMidi(): CMIDI()
{
	m_hBufferReturnEvent = ::CreateEvent(0, FALSE, FALSE, TEXT("Wait For Buffer Return"));
	ASSERT(m_hBufferReturnEvent != 0);
}

CFsMidi::~CFsMidi()
{
	Stop(FALSE);

	if(m_hBufferReturnEvent)
		::CloseHandle(m_hBufferReturnEvent);
}

// Operation
DWORD CFsMidi::PlayMidi(HWND hwnd,char* MidiFile)
{
	// 开启MIDI的硬件设备,我们使用一般内定值
	mciOpenParms.lpstrDeviceType = "sequencer";
	// 这个参数就是要播放的MIDI文件名
	CString sPath;
	GetModuleFileDir(sPath);
	sPath += MidiFile;
	mciOpenParms.lpstrElementName = (LPCSTR)sPath;
	//mciOpenParms.lpstrElementName = IDR_MIDI_BK;
	// 使用Message的方式来播放MIDI而不是STRING的方式
	if (dwReturn = mciSendCommand(NULL, MCI_OPEN,
							MCI_OPEN_TYPE | MCI_OPEN_ELEMENT,
							(DWORD)(LPVOID) &mciOpenParms))
		return (dwReturn);
	
	// The device opened successfully; get the device ID.
	wDeviceID = mciOpenParms.wDeviceID;
	
	// Check if the output port is the MIDI mapper.
	mciStatusParms.dwItem = MCI_SEQ_STATUS_PORT;
	if (dwReturn = mciSendCommand(wDeviceID, MCI_STATUS, 
				MCI_STATUS_ITEM, (DWORD)(LPVOID) &mciStatusParms))
	{
		mciSendCommand(wDeviceID, MCI_CLOSE, 0, NULL);
		return (dwReturn);
	}
	
	// 为了达成重复播放的目的,必须让我们的程序能够接收到
	// MM_MCINOTIFY的讯息,这个函数调用的方式,就是传递
	// WM_PLAY讯息给装置,叫它开始播放。
	mciPlayParms.dwCallback = (DWORD) hwnd;
	if (dwReturn = mciSendCommand(wDeviceID, MCI_PLAY, MCI_NOTIFY, 
								(DWORD)(LPVOID) &mciPlayParms))
	{
		mciSendCommand(wDeviceID, MCI_CLOSE, 0, NULL);
		return (dwReturn);
	}

	return (0L);
};

void CFsMidi::ReplayMidi()
{
	mciSendCommand(wDeviceID, MCI_SEEK,MCI_SEEK_TO_START, NULL);
	mciSendCommand(wDeviceID, MCI_PLAY, MCI_NOTIFY, (DWORD)(LPVOID) &mciPlayParms);
}

void CFsMidi::StopMidi()
{
	mciSendCommand(wDeviceID, MCI_CLOSE, 0, NULL);
}

bool CFsMidi::GetModuleFileDir(CString &str)
{
	CString appPath;
	DWORD dw = ::GetModuleFileName(NULL, appPath.GetBuffer(MAX_PATH), MAX_PATH);
	//注:使用该API函数得到的是程序文件完整路径文件名,去掉文件名后才是路径。
	if (dw <= 0)
		return false;

	appPath.ReleaseBuffer();

	int n = appPath.ReverseFind('\\');
	str = appPath.Left(n);
	TCHAR c = str.GetAt(n - 1);	
	if(c != '\\')            // add '\' to the string trail
		str += '\\';
		
	return true;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -