readprice.cpp
上传用户:trilite
上传日期:2007-04-24
资源大小:261k
文件大小:7k
源码类别:

酒店行业

开发平台:

Visual C++

  1. // ReadPrice.cpp: implementation of the CReadPrice class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "ReadPrice.h"
  6. #include "Resource.h"
  7. #include "mmsystem.h"
  8. #ifdef _DEBUG
  9. #undef THIS_FILE
  10. static char THIS_FILE[]=__FILE__;
  11. #define new DEBUG_NEW
  12. #endif
  13. //////////////////////////////////////////////////////////////////////
  14. // Construction/Destruction
  15. //////////////////////////////////////////////////////////////////////
  16. CString CReadPrice::RootDir; //声音文件所在的目录。
  17. CString CReadPrice::m_strsNumber[10]; //存放0~9个数字的wav文件。
  18. CString CReadPrice::m_strsHolder[14]; //存放占位信息的wav文件。
  19. char   CReadPrice::m_wavstrWelcome[20]; //存放欢迎声音
  20. char   CReadPrice::m_wavstrByeBye[20]; //存放结束声音
  21. CReadPrice::CReadPrice()
  22. {
  23. m_nStartIndex = -1;
  24. }
  25. CReadPrice::~CReadPrice()
  26. {
  27. }
  28. BOOL CReadPrice::Format2Voice(double price)
  29. {
  30. if(price > 1E8) //如果价格大于壹亿,那么认为数字太大!
  31. {
  32. AfxMessageBox("数字太大!", MB_OK);
  33. return FALSE;
  34. }
  35. memset(&m_Voice, 0, sizeof(m_Voice));
  36. for(int i = 0; i < sizeof(m_Voice.m_pstrHolder) / sizeof(m_Voice.m_pstrHolder[0]); i++)
  37. m_Voice.m_pstrHolder[i] = &m_strsHolder[i];
  38. //将"个"去掉
  39. m_Voice.m_pstrHolder[0] = 
  40. m_Voice.m_pstrHolder[5] =
  41. m_Voice.m_pstrHolder[10] = NULL;
  42. //格式化价格数字
  43. CString strTemp;
  44. strTemp.Format("%.2f", price);
  45. strTemp.MakeReverse();
  46. TRACE("%sn", strTemp);
  47. //依照原则来处理数字
  48. strTemp.SetAt(2, '#');//将小数点去掉
  49. if(strTemp.GetLength() > 7)//增加万位
  50. {
  51. #if(_MSC_VER==1100)
  52. strTemp = strTemp.Left(7) + '#' + strTemp.Right(strTemp.GetLength() - 7);
  53. #else
  54. #if(_MSC_VER>1100)
  55. strTemp.Insert(7, '#');
  56. #endif
  57. #endif
  58. TRACE("%sn", strTemp);
  59. }
  60. if(strTemp.GetLength() > 12)//增加亿位
  61. {
  62. #if(_MSC_VER==1100)
  63. strTemp = strTemp.Left(12) + '#' + strTemp.Right(strTemp.GetLength() - 12);
  64. #else
  65. #if(_MSC_VER>1100)
  66. strTemp.Insert(12, '#');
  67. #endif
  68. #endif
  69. TRACE("%sn", strTemp);
  70. }
  71. strTemp.MakeReverse();
  72. strTemp = CString('#', 14) + strTemp;
  73. strTemp = strTemp.Right(14);//补满14位
  74. ASSERT(sizeof(m_Voice.m_bstrPrice) == 14);
  75. strncpy(m_Voice.m_bstrPrice, LPCTSTR(strTemp), sizeof(m_Voice.m_bstrPrice));
  76. for( i = 0; i < sizeof(m_Voice.m_bstrPrice); i++)
  77. {
  78. if(m_Voice.m_bstrPrice[i] == '#')
  79. {
  80. m_Voice.m_bstrPrice[i] = 'x0';
  81. }
  82. }
  83. //格式化数字相应的声音文件。
  84. //第一次扫描
  85. for( i = 0; i < sizeof(m_Voice.m_bstrPrice); i++)
  86. {
  87. if(m_Voice.m_bstrPrice[i] != 'x0')
  88. {
  89. m_Voice.m_pstrNumber[i] = 
  90. &this->m_strsNumber[m_Voice.m_bstrPrice[i] - '0'];
  91. }
  92. }
  93. //第二次扫描
  94. bool LastCharIs0=false;
  95. for( i = 0; i < sizeof(m_Voice.m_bstrPrice); i++)
  96. {
  97. if(m_Voice.m_bstrPrice[i] == 'x0')
  98. continue;
  99. if(m_Voice.m_bstrPrice[i] == '0')
  100. {
  101. //占位信息不读
  102. m_Voice.m_pstrHolder[i] = NULL;
  103. //如果0在个位,那么数字0不读。
  104. if(LastCharIs0 == true)
  105. {
  106. //如果数字连续为0,除最后一个外都不读(只读最后一个0)。
  107. m_Voice.m_pstrNumber[i - 1] = NULL;
  108. }
  109. if(i == 0 || i == 5 || i == 10)
  110. {
  111. m_Voice.m_pstrNumber[i] = NULL;
  112. }
  113. LastCharIs0 = true;
  114. }
  115. else
  116. {
  117. LastCharIs0 = false;
  118. }
  119. }
  120. if(m_Voice.m_bstrPrice[sizeof(m_Voice.m_bstrPrice) - 1] == '0')
  121. {
  122. //如果0在"分"位,则不读。
  123. m_Voice.m_pstrNumber[sizeof(m_Voice.m_bstrPrice) - 1] = NULL;
  124. }
  125. return TRUE;
  126. }
  127. BOOL CReadPrice::ReadPrice(double price)
  128. {
  129. if(Format2Voice(price))
  130. {
  131. ASSERT(sizeof(m_Voice.m_bstrPrice) == 14);
  132. for(int i = 0; i < sizeof(m_Voice.m_bstrPrice); i++)
  133. {
  134. //查找第一个开始的数字。
  135. if(m_Voice.m_bstrPrice[i] != 'x0' && m_Voice.m_bstrPrice[i] != '0')
  136. {
  137. break;
  138. }
  139. }
  140. i < sizeof(m_Voice.m_bstrPrice) ? m_nStartIndex = i : -1;
  141. return (Play() == 0);
  142. //AfxBeginThread(&CReadPrice::Play, NULL);
  143. //return TRUE;
  144. }
  145. else
  146. return FALSE;
  147. }
  148. void CReadPrice::Init()
  149. {
  150. //初始化CReadPrice类中,静态成员变量。
  151. char *szLabels[14] = {
  152. "个","亿","千","百","十",
  153. "个","万","千","百","十",
  154. "个","元","角","分"};
  155. HKEY hkResult = 0;
  156. CString strSub;
  157. strSub = "Software\ParkSys\Voice";
  158. int status = ::RegOpenKeyEx(HKEY_CURRENT_USER,
  159. LPCTSTR(strSub), NULL,  KEY_READ , &hkResult);
  160. if(status != ERROR_SUCCESS)
  161. {
  162. TRACE("Open registry fail!n");
  163. AfxMessageBox("打开注册表失败!", MB_OK | MB_ICONERROR);
  164. THROW(new CException(TRUE));
  165. }
  166. char szTemp[20];
  167. unsigned char szData[50];
  168. unsigned long lpcbData;
  169. TRY
  170. {
  171. //read 0~10
  172. CReadPrice::RootDir.Empty();
  173. lpcbData = sizeof(szData);
  174. status = RegQueryValueEx(hkResult, "RootDir", NULL, NULL,
  175. szData, &lpcbData);
  176. CReadPrice::RootDir = szData;
  177. if(!CReadPrice::RootDir.IsEmpty())
  178. {
  179. if(CReadPrice::RootDir.Right(1) != '\')
  180. CReadPrice::RootDir += "\";
  181. }
  182. for(int i = 0; i < 10; i++)
  183. {
  184. wsprintf(szTemp, "%d", i);
  185. CReadPrice::m_strsNumber[i].Empty();
  186. lpcbData = sizeof(szData);
  187. status = RegQueryValueEx(hkResult, (char*)szTemp, NULL, NULL,
  188. szData, &lpcbData);
  189. if(status != ERROR_SUCCESS)
  190. {
  191. THROW(new CException(TRUE));
  192. }
  193. TRACE("%d=%sn", i, szData);
  194. CReadPrice::m_strsNumber[i] = szData;
  195. }
  196. for(i = 0; i< sizeof(szLabels) / sizeof(szLabels[0]); i++)
  197. {
  198. //读取占位信息
  199. lpcbData = sizeof(szData);
  200. status = RegQueryValueEx(hkResult, szLabels[i], NULL, NULL,
  201. szData, &lpcbData);
  202. if(status != ERROR_SUCCESS)
  203. {
  204. THROW(new CException(TRUE));
  205. }
  206. TRACE("%s=%sn", szLabels[i], szData);
  207. CReadPrice::m_strsHolder[i] = szData;
  208. }
  209. lpcbData = sizeof(szData);
  210. status = RegQueryValueEx(hkResult, "Welcome", NULL, NULL,
  211. szData, &lpcbData);
  212. if(status != ERROR_SUCCESS)
  213. {
  214. THROW(new CException(TRUE));
  215. }
  216. wsprintf(m_wavstrWelcome, "%s", szData);
  217. lpcbData = sizeof(szData);
  218. status = RegQueryValueEx(hkResult, "ByeBye", NULL, NULL,
  219. szData, &lpcbData);
  220. if(status != ERROR_SUCCESS)
  221. {
  222. THROW(new CException(TRUE));
  223. }
  224. wsprintf(m_wavstrByeBye, "%s", szData);
  225. }
  226. CATCH_ALL(e)
  227. {
  228. AfxMessageBox("读取注册表发生错误!", MB_OK | MB_ICONINFORMATION);
  229. THROW_LAST();
  230. }
  231. END_CATCH_ALL
  232. ::RegCloseKey(hkResult);
  233. }
  234. UINT CReadPrice::Play(LPVOID pParam)
  235. {
  236. if(m_nStartIndex < 0)
  237. return 0xFF;
  238. //播放欢迎
  239. ::PlaySound(this->RootDir + m_wavstrWelcome, NULL, SND_FILENAME | SND_SYNC);
  240. for( int i = m_nStartIndex; i < sizeof(m_Voice.m_bstrPrice); i++)
  241. {
  242. BOOL result;
  243. if(m_Voice.m_pstrNumber[i] != NULL)
  244. {
  245. result = ::PlaySound(this->RootDir + *m_Voice.m_pstrNumber[i], NULL, SND_FILENAME | SND_SYNC);
  246. if(result == FALSE)
  247. {
  248. AfxMessageBox("人工智能报价发生错误!", MB_OK | MB_ICONINFORMATION);
  249. return 0xFF;//失败
  250. }
  251. }
  252. if(m_Voice.m_pstrHolder[i] != NULL)
  253. {
  254. result = ::PlaySound(this->RootDir + *m_Voice.m_pstrHolder[i], NULL, SND_FILENAME | SND_SYNC);
  255. if(result == FALSE)
  256. {
  257. AfxMessageBox("人工智能报价发生错误!", MB_OK | MB_ICONINFORMATION);
  258. return 0xFF; //失败
  259. }
  260. }
  261. }
  262. //播放结束语
  263. ::PlaySound(this->RootDir + m_wavstrByeBye, NULL, SND_FILENAME | SND_SYNC);
  264. return 0; //成功
  265. }