UiMsgSel.cpp
上传用户:dzyhzl
上传日期:2019-04-29
资源大小:56270k
文件大小:6k
源码类别:

模拟服务器

开发平台:

C/C++

  1. // -------------------------------------------------------------------------
  2. // 文件名 : UiMsgSel.h
  3. // 创建者 : Wooy(Wu yue)
  4. // 创建时间 : 2003-1-6
  5. // 功能描述 : 带滚动条的消息选择
  6. // -------------------------------------------------------------------------
  7. #include "KWin32.h"
  8. #include "KIniFile.h"
  9. #include "../Elem/WndMessage.h"
  10. #include "../Elem/Wnds.h"
  11. #include "UiMsgSel.h"
  12. #include "../../../core/src/coreshell.h"
  13. #include "../../../core/src/GameDataDef.h"
  14. #include "../UiBase.h"
  15. #include "../UiSoundSetting.h"
  16. extern iCoreShell* g_pCoreShell;
  17. #define SCHEME_INI "滚动选择界面.ini"
  18. KUiMsgSel* KUiMsgSel::m_pSelf = NULL;
  19. //--------------------------------------------------------------------------
  20. // 功能:打开窗口,返回唯一的一个类对象实例
  21. //--------------------------------------------------------------------------
  22. KUiMsgSel* KUiMsgSel::OpenWindow(KUiQuestionAndAnswer* pContent)
  23. {
  24. if (m_pSelf == NULL)
  25. {
  26. m_pSelf = new KUiMsgSel;
  27. if (m_pSelf)
  28. m_pSelf->Initialize();
  29. }
  30. if (m_pSelf)
  31. {
  32. UiSoundPlay(UI_SI_WND_OPENCLOSE);
  33. m_pSelf->BringToTop();
  34. m_pSelf->Show(pContent);
  35. }
  36. return m_pSelf;
  37. }
  38. //--------------------------------------------------------------------------
  39. // 功能:关闭销毁窗口
  40. //--------------------------------------------------------------------------
  41. void KUiMsgSel::CloseWindow(bool bDestroy)
  42. {
  43. if (m_pSelf)
  44. {
  45. m_pSelf->m_bAutoUp = false;
  46. m_pSelf->m_bAutoDown = false;
  47. Wnd_ReleaseExclusive((KWndWindow*)m_pSelf);
  48. if (bDestroy)
  49. {
  50. m_pSelf->Destroy();
  51. m_pSelf = NULL;
  52. }
  53. else
  54. m_pSelf->Hide();
  55. }
  56. }
  57. //--------------------------------------------------------------------------
  58. // 功能:初始化
  59. //--------------------------------------------------------------------------
  60. int KUiMsgSel::Initialize()
  61. {
  62. AddChild(&m_MsgScrollList);
  63. AddChild(&m_InfoText);
  64. m_Style &= ~WND_S_VISIBLE;
  65. Wnd_AddWindow(this, WL_TOPMOST);
  66. char Scheme[256];
  67. g_UiBase.GetCurSchemePath(Scheme, 256);
  68. LoadScheme(Scheme);
  69. return true;
  70. }
  71. //--------------------------------------------------------------------------
  72. // 功能:载入窗口的界面方案
  73. //--------------------------------------------------------------------------
  74. void KUiMsgSel::LoadScheme(const char* pScheme)
  75. {
  76. if (m_pSelf == NULL)
  77. return;
  78. char Buff[128];
  79. KIniFile Ini;
  80. sprintf(Buff, "%s\"SCHEME_INI, pScheme);
  81. if (Ini.Load(Buff))
  82. {
  83. m_pSelf->Init(&Ini, "Main");
  84. m_pSelf->m_MsgScrollList.Init(&Ini, "Select");
  85. m_pSelf->m_InfoText.Init(&Ini, "InfoText");
  86. }
  87. }
  88. //--------------------------------------------------------------------------
  89. // 功能:窗口消息函数
  90. //--------------------------------------------------------------------------
  91. int KUiMsgSel::WndProc(unsigned int uMsg, unsigned int uParam, int nParam)
  92. {
  93. int nRet = 0;
  94. switch(uMsg)
  95. {
  96. case WM_MOUSEMOVE:
  97. {
  98. int x = LOWORD(nParam) - m_nAbsoluteLeft;
  99. int y = HIWORD(nParam) - m_nAbsoluteTop;
  100. if (x >= 0 && x <= m_Width &&
  101. y >= 0 && y <= m_Height)
  102. {
  103. int nMLeft = 0;
  104. int nMTop = 0;
  105. m_MsgScrollList.GetMessageListBox()->GetPosition(&nMLeft, &nMTop);
  106. int nMWidth = 0;
  107. int nMHeight = 0;
  108. m_MsgScrollList.GetMessageListBox()->GetSize(&nMWidth, &nMHeight);
  109. if (x >= nMLeft && x <= nMLeft + nMWidth)
  110. {
  111. if (y <= nMTop && y >= nMTop - 50)
  112. m_bAutoUp = true;
  113. else
  114. m_bAutoUp = false;
  115. if (y >= nMTop + nMHeight && y <= nMTop + nMHeight + 50)
  116. m_bAutoDown = true;
  117. else
  118. m_bAutoDown = false;
  119. }
  120. }
  121. }
  122. break;
  123. case WND_N_LIST_ITEM_HIGHLIGHT:
  124. m_bAutoUp = false;
  125. m_bAutoDown = false;
  126. if (nParam >= 0)
  127. m_MsgScrollList.GetMessageListBox()->SetCurSel(nParam);
  128. else
  129. {
  130. ChangeCurSel(true); //经实际测试在nParam < 0 时是向下
  131. nRet = 1;
  132. }
  133. break;
  134. case WND_N_LIST_ITEM_ACTIVE:
  135. m_bAutoUp = false;
  136. m_bAutoDown = false;
  137. if (nParam >= 0)
  138. OnClickMsg(nParam);
  139. break;
  140. case WM_KEYDOWN:
  141. m_bAutoUp = false;
  142. m_bAutoDown = false;
  143. if (uParam == VK_RETURN)
  144. {
  145. nRet = m_MsgScrollList.GetMessageListBox()->GetCurSel();
  146. if (nRet > 0)
  147. OnClickMsg(nParam);
  148. nRet = 1;
  149. }
  150. else if (uParam == VK_UP)
  151. {
  152. ChangeCurSel(false);
  153. nRet = 1;
  154. }
  155. else if (uParam == VK_DOWN)
  156. {
  157. ChangeCurSel(true);
  158. nRet = 1;
  159. }
  160. break;
  161. default:
  162. nRet = KWndShowAnimate::WndProc(uMsg, uParam, nParam);
  163. break;
  164. }
  165. return 0;
  166. }
  167. //--------------------------------------------------------------------------
  168. // 功能:响应点击按钮
  169. //--------------------------------------------------------------------------
  170. void KUiMsgSel::OnClickMsg(int nMsg)
  171. {
  172. CloseWindow(false);
  173. m_MsgScrollList.GetMessageListBox()->Clear();
  174. g_pCoreShell->OperationRequest(GOI_QUESTION_CHOOSE, 0, nMsg);
  175. }
  176. void KUiMsgSel::ChangeCurSel(bool bNext)
  177. {
  178. int nRet = m_MsgScrollList.GetMessageListBox()->GetCurSel();
  179. if (bNext)
  180. {
  181. if (nRet < m_MsgScrollList.GetMessageListBox()->GetMsgCount() - 1)
  182. m_MsgScrollList.GetMessageListBox()->SetCurSel(nRet + 1);
  183. }
  184. else
  185. {
  186. if (nRet  > 0)
  187. m_MsgScrollList.GetMessageListBox()->SetCurSel(nRet - 1);
  188. }
  189. }
  190. //--------------------------------------------------------------------------
  191. // 功能:显示窗口
  192. //--------------------------------------------------------------------------
  193. void KUiMsgSel::Show(KUiQuestionAndAnswer* pContent)
  194. {
  195. if (pContent && pContent->AnswerCount >= 0)
  196. {
  197. m_MsgScrollList.GetMessageListBox()->Clear();
  198. m_InfoText.SetText(pContent->Question, pContent->QuestionLen);
  199. int i = 0;
  200. if (pContent->AnswerCount <= 0)
  201. {
  202. m_MsgScrollList.GetMessageListBox()->AddOneMessage("结束对话", -1);
  203. }
  204. else
  205. {
  206. for (i = 0; i < pContent->AnswerCount ; i++)
  207. {
  208. if (!m_MsgScrollList.GetMessageListBox()->AddOneMessage(pContent->Answer[i].AnswerText, pContent->Answer[i].AnswerLen))
  209. m_MsgScrollList.GetMessageListBox()->AddOneMessage("[--脚本或脚本处理有错!--]", -1);
  210. }
  211. }
  212. }
  213. KWndShowAnimate::Show();
  214. Wnd_SetExclusive((KWndWindow*)this);
  215. m_uLastScrollTime = IR_GetCurrentTime();
  216. m_bAutoUp = false;
  217. m_bAutoDown = false;
  218. }
  219. void KUiMsgSel::Breathe()
  220. {
  221. if (m_bAutoUp)
  222. {
  223. if (IR_IsTimePassed(200, m_uLastScrollTime))
  224. {
  225. ChangeCurSel(false);
  226. m_uLastScrollTime = IR_GetCurrentTime();
  227. }
  228. }
  229. if (m_bAutoDown)
  230. {
  231. if (IR_IsTimePassed(200, m_uLastScrollTime))
  232. {
  233. ChangeCurSel(true);
  234. m_uLastScrollTime = IR_GetCurrentTime();
  235. }
  236. }
  237. }