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

📄 readprice.cpp

📁 停车场管理系统
💻 CPP
字号:
// ReadPrice.cpp: implementation of the CReadPrice class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "ReadPrice.h"
#include "Resource.h"
#include "mmsystem.h"

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


//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CString CReadPrice::RootDir;			//声音文件所在的目录。
CString CReadPrice::m_strsNumber[10];	//存放0~9个数字的wav文件。
CString CReadPrice::m_strsHolder[14];	//存放占位信息的wav文件。
char   CReadPrice::m_wavstrWelcome[20];	//存放欢迎声音
char   CReadPrice::m_wavstrByeBye[20];	//存放结束声音

CReadPrice::CReadPrice()
{
	m_nStartIndex		= -1;
	
}

CReadPrice::~CReadPrice()
{

}
BOOL CReadPrice::Format2Voice(double price)
{
	if(price > 1E8) //如果价格大于壹亿,那么认为数字太大!
	{
		AfxMessageBox("数字太大!", MB_OK);
		return FALSE;
	}

	memset(&m_Voice, 0, sizeof(m_Voice));

	for(int i = 0; i < sizeof(m_Voice.m_pstrHolder) / sizeof(m_Voice.m_pstrHolder[0]); i++)
		m_Voice.m_pstrHolder[i] = &m_strsHolder[i];
	//将"个"去掉
	m_Voice.m_pstrHolder[0] = 
		m_Voice.m_pstrHolder[5] =
		m_Voice.m_pstrHolder[10] = NULL;


	//格式化价格数字
	CString strTemp;
	strTemp.Format("%.2f", price);

	strTemp.MakeReverse();
	TRACE("%s\n", strTemp);
	//依照原则来处理数字
	strTemp.SetAt(2, '#');//将小数点去掉

	if(strTemp.GetLength() > 7)//增加万位
	{	
#if(_MSC_VER==1100)	
	strTemp = strTemp.Left(7) + '#' + strTemp.Right(strTemp.GetLength() - 7);	
#else
	#if(_MSC_VER>1100)
		strTemp.Insert(7, '#');
	#endif
#endif
		TRACE("%s\n", strTemp);
	}

	if(strTemp.GetLength() > 12)//增加亿位
	{
#if(_MSC_VER==1100)	
	strTemp = strTemp.Left(12) + '#' + strTemp.Right(strTemp.GetLength() - 12);	
#else
	#if(_MSC_VER>1100)
		strTemp.Insert(12, '#');
	#endif
#endif
		TRACE("%s\n", strTemp);
	}
	strTemp.MakeReverse();
	strTemp = CString('#', 14) + strTemp;
	strTemp = strTemp.Right(14);//补满14位

	ASSERT(sizeof(m_Voice.m_bstrPrice) == 14);
	strncpy(m_Voice.m_bstrPrice, LPCTSTR(strTemp), sizeof(m_Voice.m_bstrPrice));
	for( i = 0; i < sizeof(m_Voice.m_bstrPrice); i++)
	{
		if(m_Voice.m_bstrPrice[i] == '#')
		{
			m_Voice.m_bstrPrice[i] = '\x0';
		}
	}
	
	//格式化数字相应的声音文件。
	//第一次扫描
	for( i = 0; i < sizeof(m_Voice.m_bstrPrice); i++)
	{
		if(m_Voice.m_bstrPrice[i] != '\x0')
		{
			m_Voice.m_pstrNumber[i] = 
				&this->m_strsNumber[m_Voice.m_bstrPrice[i] - '0'];
		}
	}
	//第二次扫描
	bool LastCharIs0=false;
	for( i = 0; i < sizeof(m_Voice.m_bstrPrice); i++)
	{
		if(m_Voice.m_bstrPrice[i] == '\x0')
			continue;
		if(m_Voice.m_bstrPrice[i] == '0')
		{
			//占位信息不读
			m_Voice.m_pstrHolder[i] = NULL;
			//如果0在个位,那么数字0不读。
			if(LastCharIs0 == true)
			{
				//如果数字连续为0,除最后一个外都不读(只读最后一个0)。
				m_Voice.m_pstrNumber[i - 1] = NULL;
			}
			if(i == 0 || i == 5 || i == 10)
			{
				m_Voice.m_pstrNumber[i] = NULL;
			}
			LastCharIs0 = true;
		}
		else
		{
			LastCharIs0 = false;
		}
	}
	if(m_Voice.m_bstrPrice[sizeof(m_Voice.m_bstrPrice) - 1] == '0')
	{
		//如果0在"分"位,则不读。
		m_Voice.m_pstrNumber[sizeof(m_Voice.m_bstrPrice) - 1] = NULL;
	}

	return TRUE;
}
BOOL CReadPrice::ReadPrice(double price)
{
	if(Format2Voice(price))
	{
		ASSERT(sizeof(m_Voice.m_bstrPrice) == 14);
		for(int i = 0; i < sizeof(m_Voice.m_bstrPrice); i++)
		{
			//查找第一个开始的数字。
			if(m_Voice.m_bstrPrice[i] != '\x0' && m_Voice.m_bstrPrice[i] != '0')
			{
				break;
			}
		}

		i < sizeof(m_Voice.m_bstrPrice) ? m_nStartIndex = i : -1;

		return (Play() == 0);
		//AfxBeginThread(&CReadPrice::Play, NULL);
		//return TRUE;

	}
	else
		return FALSE;


}
void CReadPrice::Init()
{
	//初始化CReadPrice类中,静态成员变量。
	char *szLabels[14] = {
		"个","亿","千","百","十",
		"个","万","千","百","十",
		"个","元","角","分"};
	HKEY hkResult = 0;
	CString strSub;

	strSub = "Software\\ParkSys\\Voice";
	int status = ::RegOpenKeyEx(HKEY_CURRENT_USER,
		LPCTSTR(strSub), NULL,  KEY_READ , &hkResult);
	if(status != ERROR_SUCCESS)
	{
		TRACE("Open registry fail!\n");
		AfxMessageBox("打开注册表失败!", MB_OK | MB_ICONERROR);
		THROW(new CException(TRUE));
	}

	char szTemp[20];
	unsigned char szData[50];
	unsigned long lpcbData;
	TRY
	{
		//read 0~10
		CReadPrice::RootDir.Empty();

		lpcbData = sizeof(szData);
		status = RegQueryValueEx(hkResult, "RootDir", NULL, NULL,
				szData, &lpcbData);
		CReadPrice::RootDir = szData;
		if(!CReadPrice::RootDir.IsEmpty())
		{
			if(CReadPrice::RootDir.Right(1) != '\\')
				CReadPrice::RootDir += "\\";
		}

		for(int i = 0; i < 10; i++)
		{
			wsprintf(szTemp, "%d", i);

			CReadPrice::m_strsNumber[i].Empty();

			lpcbData = sizeof(szData);
			status = RegQueryValueEx(hkResult, (char*)szTemp, NULL, NULL,
				szData, &lpcbData);
			if(status != ERROR_SUCCESS)
			{
				THROW(new CException(TRUE));
			}
			TRACE("%d=%s\n", i, szData);
			CReadPrice::m_strsNumber[i] = szData;
		}
		
	
		for(i = 0; i< sizeof(szLabels) / sizeof(szLabels[0]); i++)
		{			
			//读取占位信息

			lpcbData = sizeof(szData);
			status = RegQueryValueEx(hkResult, szLabels[i], NULL, NULL,
				szData, &lpcbData);
			if(status != ERROR_SUCCESS)
			{
				THROW(new CException(TRUE));
			}
			TRACE("%s=%s\n", szLabels[i], szData);
			CReadPrice::m_strsHolder[i] = szData;
		}

		lpcbData = sizeof(szData);
		status = RegQueryValueEx(hkResult, "Welcome", NULL, NULL,
			szData, &lpcbData);
		if(status != ERROR_SUCCESS)
		{
			THROW(new CException(TRUE));
		}

		wsprintf(m_wavstrWelcome, "%s", szData);

		lpcbData = sizeof(szData);
		status = RegQueryValueEx(hkResult, "ByeBye", NULL, NULL,
			szData, &lpcbData);
		if(status != ERROR_SUCCESS)
		{
			THROW(new CException(TRUE));
		}
		wsprintf(m_wavstrByeBye, "%s", szData);		
	}
	CATCH_ALL(e)
	{
		AfxMessageBox("读取注册表发生错误!", MB_OK | MB_ICONINFORMATION);		
		THROW_LAST();
	}
	END_CATCH_ALL

	::RegCloseKey(hkResult);

}
UINT CReadPrice::Play(LPVOID pParam)
{
	if(m_nStartIndex < 0)
		return 0xFF;
	//播放欢迎
	::PlaySound(this->RootDir + m_wavstrWelcome, NULL, SND_FILENAME | SND_SYNC);
	for( int i = m_nStartIndex; i < sizeof(m_Voice.m_bstrPrice); i++)
	{		
		BOOL result;
		if(m_Voice.m_pstrNumber[i] != NULL)
		{
			result = ::PlaySound(this->RootDir + *m_Voice.m_pstrNumber[i], NULL, SND_FILENAME | SND_SYNC);
			if(result == FALSE)
			{
				AfxMessageBox("人工智能报价发生错误!", MB_OK | MB_ICONINFORMATION);
				return 0xFF;//失败
			}
		}
		if(m_Voice.m_pstrHolder[i] != NULL)
		{
			result = ::PlaySound(this->RootDir + *m_Voice.m_pstrHolder[i], NULL, SND_FILENAME | SND_SYNC);
			if(result == FALSE)
			{
				AfxMessageBox("人工智能报价发生错误!", MB_OK | MB_ICONINFORMATION);
				return 0xFF; //失败
			}
		}
	}
	//播放结束语
	::PlaySound(this->RootDir + m_wavstrByeBye, NULL, SND_FILENAME | SND_SYNC);	
	return 0; //成功
}

⌨️ 快捷键说明

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