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

📄 mci.cpp

📁 RPG游戏的剧情部分源码。是Visual C++角色扮演游戏程序设计的第七章的源码
💻 CPP
字号:
//
//	MCI类别/CD-DA/Wave类别
//
//		Copyright (c) 2000-2001 Chihiro.SAKAMOTO (HyperWorks)
//
#include "stdafx.h"
#include "Mci.h"
#include "Window.h"
#include "Misc.h"

//
// 开启
//
bool CMci::Open(CWindow *window)
{
	Window = window;

	return true;
}

//
// 关闭
//
bool CMci::Close()
{
	return true;
}

//
// 播放(乐曲号码)
//
bool CMci::Play(int no)
{
	return false;
}

//
// 播放(档名)
//
bool CMci::Play(const char *name)
{
	return false;
}

//
// 重新播放
//
bool CMci::Replay()
{
	return false;
}

//
// 停止
//
bool CMci::Stop()
{
	return false;
}

//
// 显示错误事件
//
void CMci::MciErrorMessageBox(DWORD err)
{
	char	errstr[256];
	mciGetErrorString(err, errstr, sizeof(errstr));
	Window->MessageBox(errstr, errTitle);
}

//
// 发行MCI的open命令
//
bool CMci::MciOpen(const char *command)
{
	DWORD err;
	char	result[128];
	if ((err = mciSendString(command, result, sizeof(result), 0)) != 0) {
		MciErrorMessageBox(err);
		return false;
	}

	char *p;
	Id = strtol(result, &p, 0);

	return true;
}

//
// 发行MCI的open命令
//
bool CMci::MciOpen()
{
	char	command[128];
	sprintf(command, "open %s wait", device);
	return MciOpen(command);
}

//
// 发行MCI的open命令
//
bool CMci::MciOpen(const char *dev, const char *element)
{
	char	command[_MAX_PATH + 128];
	sprintf(command, "open %s!%s alias %s wait", dev, element, device);
	return MciOpen(command);
}

//
// 发行MCI的close命令
//
bool CMci::MciClose()
{
	Id = 0;

	char	command[128];
	sprintf(command, "close %s wait", device);
	if (mciSendString(command, NULL, 0, 0) != 0)
		return false;
	return true;
}

//
// 发行MCI的play命令
//
bool CMci::MciPlay(const char *request)
{
	char	command[256];
	sprintf(command, "play %s %s notify", device, request);

	DWORD	err;
	if ((err = mciSendString(command, NULL, 0, *Window)) != 0) {
		MciErrorMessageBox(err);
		return false;
	}
	return true;
}

//
// 发行MCI的stop命令
//
bool CMci::MciStop()
{
	char	command[128];
	sprintf(command, "stop %s wait", device);
	if (mciSendString(command, NULL, 0, 0) != 0)
		return false;
	return true;
}

//
// 发行MCI的set命令
//
bool CMci::MciSet(const char *request)
{
	char	command[128];
	sprintf(command, "set %s %s wait", device, request);

	DWORD	err;
	if ((err = mciSendString(command, NULL, 0, 0)) != 0) {
		MciErrorMessageBox(err);
		return false;
	}
	return true;
}

//
// 发行MCI的status命令
//
bool CMci::MciStatus(const char *request, char *result, int resultlen)
{
	char	command[128];
	sprintf(command, "status %s %s wait", device, request);

	DWORD err;
	if ((err = mciSendString(command, result, resultlen, 0)) != 0) {
		MciErrorMessageBox(err);
		return false;
	}
	return true;
}

//
// 光盘机里是否有媒体?
//
int CDAudio::MediaChk()
{
	char	result[128];
	if (!MciStatus("media present", result, sizeof(result)))
		return -1;
	if (stricmp(result, "true") == 0)
		return 0;
	return 1;
}

//
// 开启光盘机
//
bool CDAudio::Open(CWindow *win)
{
	CMci::Open(win);

	if (!MciOpen())
		return false;

	if (!MciSet("time format tmsf")) {
		MciClose();
		return false;
	}

	bool chkOk = false;

	do {
		switch (MediaChk()) {
		  case -1:
			MciClose();
			return false;

		  case 0:
			chkOk = true;
			break;

		  default:
#ifdef	notdef		//若光盘机中没有CD而出现错误时 #ifdef -> #ifndef
					//
					//
			if (Window->MessageBox(ApplicationTitle "傪俠俢僪儔僀僽偵擖傟偰偔偩偝偄丅",
				ApplicationTitle, MB_RETRYCANCEL) == IDCANCEL) {
				MciClose();
				return false;
			}
			break;
#else
			MciClose();
			return false;
#endif
		}
	} while (!chkOk) ;

	IsOpen = true;

	return true;
}

//
// 关闭光盘机
//
bool CDAudio::Close()
{
	if (IsOpen) {
		Stop();
		MciClose();
	}
	IsOpen = false;
	return true;
}

//
// 开始播放CD(只播放指定乐曲)
//
bool CDAudio::Play(int no)
{
	if (!IsOpen)
		return false;

	Stop();
	PlayTrack = no;

	no++;		// 这里是以MixedCD为基准,所以播放1首乐曲

	// 检查乐曲长度
	// 设定只播放此范围

	char	request[64];
	sprintf(request, "length track %d", no);

	char	result[128];
	if (!MciStatus(request, result, sizeof(result)))
		return false;

	sprintf(request, "from %d:00:00:00 to %d:%s", no, no, result);
	if (!MciPlay(request))
		return false;
	return true;
}

//
// 开始播放CD(若设定档名一定会error)
//
bool CDAudio::Play(const char *)
{
	return false;
}

//
// 重新播放CD
//
bool CDAudio::Replay()
{
	return Play(PlayTrack);
}

//
// 停止播放CD
//
bool CDAudio::Stop()
{
	if (!IsOpen)
		return false;

	if (PlayTrack > 0) {
		MciStop();
		PlayTrack = 0;
	}
	return true;
}

//
// 播放Wave
//
bool WaveOut::Play(const char *name)
{
	Stop();

	char	fullpath[_MAX_PATH];
	FullPath(fullpath, name);

	if (!MciOpen("waveaudio", fullpath))
		return false;

	if (!MciPlay(""))
		return false;

	playing = true;

	return true;
}

//
// 播放Wave(非实作)
//
bool WaveOut::Play(int)
{
	return false;
}

//
// 停止播放Wave
//
bool WaveOut::Stop()
{
	if (playing) {
		playing = false;
		MciStop();
		MciClose();
	}
	return true;
}

⌨️ 快捷键说明

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