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

模拟服务器

开发平台:

C/C++

  1. /* 
  2.  * File:     KUiHelper.cpp
  3.  * Desc:     详细帮助窗口
  4.  * Author:   flying
  5.  * Creation: 2003/7/16
  6.  */
  7. //////////////////////////////////////////////////////////////////////////
  8. //                     帮助界面文件名字的历史来历
  9. // 为什么详细帮助界面叫做Helper2而由详细帮助界面激活的图片帮助界面叫做
  10. // Helper呢?这是有原因的。什么原因呢?最初的时候传说需要一个类似Diablo
  11. // 按H弹出的关于按钮的图片帮助。这也是最初所理解的帮助系统,而且在那时
  12. // 实现,名字自然叫做Helper了。之后需要一个索引类型的帮助,而且把原先所
  13. // 要求的帮助系统转移到那里去激活,于是在开发时间上在图片帮助之后的索引
  14. // 帮助就叫做Helper2了。口合  口合
  15. //////////////////////////////////////////////////////////////////////////
  16. //-----------------------------------------------------------------------------
  17. #include "KWin32.h"
  18. #include "KIniFile.h"
  19. #include "../Elem/wnds.h"
  20. #include "../Elem/WndMessage.h"
  21. #include "../Elem/WndMessageListBox.h"
  22. #include "../UiBase.h"
  23. #include "UiHelper2.h"
  24. #include "UiHelper.h"
  25. #include "../UiSoundSetting.h"
  26. #include "../../../core/src/gamedatadef.h"
  27. #include "../../../core/src/CoreShell.h"
  28. #include "../ShortcutKey.h"
  29. extern iRepresentShell* g_pRepresentShell;
  30. extern iCoreShell* g_pCoreShell;
  31. //extern IInlinePicEngineSink* g_pIInlinePicSink;
  32. //extern KMouseOver g_MouseOver;
  33. KUiHelper2* KUiHelper2::m_pSelf = NULL;
  34. #define SCHEME_INI_HELP2 "详细帮助界面.ini"
  35. #define DETAIL_HELP_LIST "详细帮助项目.ini"
  36. //--------------------------------------------------------------------------
  37. // 功能:如果窗口正被显示,则返回实例指针
  38. //--------------------------------------------------------------------------
  39. KUiHelper2* KUiHelper2::GetIfVisible()
  40. {
  41. if (m_pSelf && m_pSelf->IsVisible())
  42. return m_pSelf;
  43. return NULL;
  44. }
  45. KUiHelper2::KUiHelper2()
  46. {
  47. m_nIndexCount = 0;
  48. }
  49. KUiHelper2::~KUiHelper2()
  50. {
  51. Clear();
  52. }
  53. //--------------------------------------------------------------------------
  54. // 功能:打开窗口,返回唯一的一个类对象实例
  55. //--------------------------------------------------------------------------
  56. KUiHelper2* KUiHelper2::OpenWindow(bool bShow)
  57. {
  58. if (m_pSelf == NULL)
  59. {
  60. m_pSelf = new KUiHelper2;
  61. if (m_pSelf)
  62. m_pSelf->Initialize();
  63. }
  64. if (m_pSelf)
  65. {
  66. UiSoundPlay(UI_SI_WND_OPENCLOSE);
  67. m_pSelf->BringToTop();
  68. m_pSelf->Show();
  69. }
  70. return m_pSelf;
  71. }
  72. //初始化
  73. void KUiHelper2::Initialize()
  74. {
  75. AddChild(&m_BtnClose);
  76. AddChild(&m_BtnPic);
  77. AddChild(&m_BtnKeyboard);
  78. AddChild(&m_BtnWuxing);
  79. AddChild(&m_IndexList);
  80. AddChild(&m_IndexScroll);
  81. AddChild(&m_MessageList);
  82. m_IndexList.SetScrollbar(&m_IndexScroll);
  83. AddChild(&m_MessageScroll);
  84. m_MessageList.SetScrollbar(&m_MessageScroll);
  85. char Scheme[256];
  86. g_UiBase.GetCurSchemePath(Scheme, 256);
  87. LoadScheme(Scheme);
  88. Wnd_AddWindow(this);
  89. }
  90. //--------------------------------------------------------------------------
  91. // 功能:关闭窗口,同时可以选则是否删除对象实例
  92. //--------------------------------------------------------------------------
  93. void KUiHelper2::CloseWindow(bool bDestory)
  94. {
  95. if (m_pSelf)
  96. {
  97. m_pSelf->Hide();
  98. if (bDestory)
  99. {
  100. m_pSelf->Destroy();
  101. m_pSelf = NULL;
  102. }
  103. }
  104. }
  105. void KUiHelper2::LoadScheme(const char* pScheme)
  106. {
  107. if (m_pSelf)
  108. {
  109. char Buff[128];
  110. KIniFile Ini;
  111. sprintf(Buff, "%s\%s", pScheme, SCHEME_INI_HELP2);
  112. if (Ini.Load(Buff))
  113. {
  114. m_pSelf->Init(&Ini, "Main");
  115. m_pSelf->m_BtnClose.Init(&Ini, "BtnClose");
  116. m_pSelf->m_BtnPic.Init(&Ini, "BtnPic");
  117. m_pSelf->m_BtnKeyboard.Init(&Ini,"BtnKeyboard");
  118. m_pSelf->m_BtnWuxing.Init(&Ini,"BtnWuxing");
  119. m_pSelf->m_IndexList.Init(&Ini, "IndexList");
  120. m_pSelf->m_IndexScroll.Init(&Ini, "IndexScroll");
  121. m_pSelf->m_MessageScroll.Init(&Ini, "MessageScroll");
  122. m_pSelf->m_MessageList.Init(&Ini, "MessageList");
  123. m_pSelf->LoadIndexList(pScheme);
  124. }
  125. }
  126. }
  127. //窗口函数
  128. int KUiHelper2::WndProc(unsigned int uMsg, unsigned int uParam, int nParam)
  129. {
  130. int nRet = 0;
  131. switch(uMsg)
  132. {
  133. // A button is clicked.
  134. case WND_N_BUTTON_CLICK:
  135. if (uParam == (unsigned int)(KWndWindow*)&m_BtnClose)
  136. CloseWindow(false);
  137. else if (uParam == (unsigned int)(KWndWindow*)&m_BtnPic)
  138. {
  139. CloseWindow(false);
  140. KUiHelper::SelectInterfacePic();
  141. KUiHelper::OpenWindow(true);
  142. }
  143. else if (uParam == (unsigned int)(KWndWindow*)&m_BtnKeyboard)
  144. {
  145. CloseWindow(false);
  146. KUiHelper::SelectKeyboardPic();
  147. KUiHelper::OpenWindow(true);
  148. }
  149. else if(uParam == (unsigned int)(KWndWindow*)&m_BtnWuxing)
  150. {
  151. CloseWindow(false);
  152. KUiHelper::SelectWuxingPic();
  153. KUiHelper::OpenWindow(true);
  154. }
  155. break;
  156. // scrollbar's position changed.
  157. case WND_N_SCORLLBAR_POS_CHANGED:
  158. if (uParam == (unsigned int)(KWndWindow*)&m_IndexScroll)
  159. m_IndexList.SetTopItemIndex(nParam);
  160. else if (uParam == (unsigned int)(KWndWindow*)&m_MessageScroll)
  161. m_MessageList.SetFirstShowLine(nParam);
  162. break;
  163. // list's click
  164. case WND_N_LIST_ITEM_SEL:
  165. if (uParam == (unsigned int)(KWndWindow*)&m_IndexList)
  166. {
  167. int nIndex = nParam;
  168. if (nIndex < 0)
  169. nIndex = 0;
  170. // Get the content of "nParam" index.
  171. UpdateData(nIndex);
  172. }
  173. break;
  174. case WM_KEYDOWN:
  175. {
  176. int nCurIdx = 0;
  177. int nTotal = 0;
  178. // if (nParam == (unsigned int)(KWndWindow*)&m_IndexList)
  179. // {
  180. nCurIdx = m_IndexList.GetCurSel();
  181. nTotal = m_IndexList.GetCount();
  182. switch (uParam)
  183. {
  184. case VK_UP:
  185. if (nCurIdx == 0)
  186. nCurIdx = nTotal;
  187. nCurIdx = nCurIdx - 1;
  188. m_IndexList.SetCurSel(nCurIdx);
  189. m_IndexScroll.SetScrollPos(m_IndexList.GetTopItemIndex());
  190. break;
  191. case VK_DOWN:
  192. if (nCurIdx == nTotal - 1)
  193. nCurIdx = -1;
  194. nCurIdx = nCurIdx + 1;
  195. m_IndexList.SetCurSel(nCurIdx);
  196. m_IndexScroll.SetScrollPos(m_IndexList.GetTopItemIndex());
  197. break;
  198. default:
  199. break;
  200. }
  201. // }
  202. // else if (nParam == (unsigned int)(KWndWindow*)&m_MessageList)
  203. // {
  204. // nCurIdx = m_MessageList.GetCurSel();
  205. // nTotal = m_IndexList.GetCount();
  206. // switch (uParam)
  207. // {
  208. // case VK_UP:
  209. // if (nCurIdx == 0)
  210. // nCurIdx = nTotal;
  211. // nCurIdx = nCurIdx - 1;
  212. // m_MessageList.SetCurSel(nCurIdx);
  213. // m_MessageScroll.SetScrollPos(m_MessageList.GetFirstShowLine());
  214. // break;
  215. // case VK_DOWN:
  216. // if (nCurIdx == nTotal - 1)
  217. // nCurIdx = -1;
  218. // nCurIdx = nCurIdx + 1;
  219. // m_MessageList.SetCurSel(nCurIdx);
  220. // m_MessageScroll.SetScrollPos(m_MessageList.GetFirstShowLine());
  221. // break;
  222. // case VK_ESCAPE:
  223. // CloseWindow(false);
  224. // break;
  225. // default:
  226. // break;
  227. // }
  228. // }
  229. }
  230. break;
  231. default:
  232. nRet = KWndShowAnimate::WndProc(uMsg, uParam, nParam);
  233. }
  234. return nRet;
  235. }
  236. void KUiHelper2::Clear()
  237. {
  238. m_IndexList.SetContent(0, 0, 0, 0);
  239. m_nIndexCount = 0;
  240. }
  241. void KUiHelper2::LoadIndexList(const char* pScheme)
  242. {
  243. KIniFile ListIni;
  244. int nCount;
  245. char szInifile[128] = "";
  246. sprintf(szInifile, "%s\%s", pScheme, DETAIL_HELP_LIST);
  247. if (!ListIni.Load(szInifile))
  248. return;
  249. ListIni.GetInteger("List", "Count", 0, &nCount);
  250. // haha, just for fun.
  251. // be caught by freeway.. :( use "i" instead of "__"
  252. for (int i = 0; i < nCount; i++)
  253. {
  254. char szName[32] = "";
  255. char szIni[32] = "";
  256. char szIniSection[32] = "";
  257. sprintf(szName, "%d_Name", i);
  258. sprintf(szIni, "%d_Ini", i);
  259. sprintf(szIniSection, "%d_IniSection", i);
  260. ListIni.GetString("List", szName, "", m_IndexData[i].szName, 128);
  261. ListIni.GetString("List", szIni, "", m_IndexData[i].szIni, 128);
  262. ListIni.GetString("List", szIniSection, "", m_IndexData[i].szIniSection, 128);
  263. m_IndexList.SetContent((unsigned char *)&m_IndexData[0].szName, 
  264. nCount, sizeof(m_IndexData[i]), 
  265. (char *)&m_IndexData[i].szName - (char *)&m_IndexData[i].szName);
  266. m_nIndexCount = i + 1;
  267. }
  268. }
  269. void KUiHelper2::UpdateData(int nIndex)
  270. {
  271. if (strlen(m_IndexData[nIndex].szIni) == 0)
  272. {
  273. KUiHelper::OpenWindow(true);
  274. return;
  275. }
  276. KIniFile Ini;
  277. char Scheme[256];
  278. char szIniFile[128];
  279. g_UiBase.GetCurSchemePath(Scheme, 256);
  280. sprintf(szIniFile, "%s\%s", Scheme, m_IndexData[nIndex].szIni);
  281.     
  282. if (Ini.Load(szIniFile))
  283. {
  284. m_MessageList.SetFirstShowLine(0);
  285.         m_MessageScroll.SetScrollPos(0);
  286. MsgListBox_LoadContent(&m_MessageList, &Ini, 
  287. m_IndexData[nIndex].szIniSection);
  288. }
  289. }