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

模拟服务器

开发平台:

C/C++

  1. /*****************************************************************************************
  2. // 界面--选择出生地窗口
  3. // Copyright : Kingsoft 2003
  4. // Author :   Wooy(Wu yue)
  5. // CreateTime: 2003-6-7
  6. *****************************************************************************************/
  7. #include "KWin32.h"
  8. #include "KIniFile.h"
  9. #include "../Elem/WndMessage.h"
  10. #include "../Elem/Wnds.h"
  11. #include "../UiBase.h"
  12. #include "../UiShell.h"
  13. #include "../UiSoundSetting.h"
  14. #include "UiSelNativePlace.h"
  15. #include "UiLoginBg.h"
  16. #include "UiSelPlayer.h"
  17. #include "UiNewPlayer.h"
  18. #include "../../Login/Login.h"
  19. #include "../../../Engine/Src/Text.h"
  20. #include <crtdbg.h>
  21. #define SCHEME_INI_SELSERV "选新手村.ini"
  22. #define PLACE_LIST_FILE "\Settings\NativePlaceList.ini"
  23. KUiSelNativePlace* KUiSelNativePlace::m_pSelf = NULL;
  24. //--------------------------------------------------------------------------
  25. // 功能:构造函数
  26. //--------------------------------------------------------------------------
  27. KUiSelNativePlace::KUiSelNativePlace()
  28. {
  29. m_pPlaceList = NULL;
  30. m_szLoginBg[0] = 0;
  31. m_nLastSelPlace = 0;
  32. }
  33. KUiSelNativePlace::~KUiSelNativePlace()
  34. {
  35. m_List.SetContent(NULL, 0, 0, 0);
  36. if (m_pPlaceList)
  37. {
  38. free(m_pPlaceList);
  39. m_pPlaceList = NULL;
  40. }
  41. }
  42. //--------------------------------------------------------------------------
  43. // 功能:打开窗口,返回唯一的一个类对象实例
  44. //--------------------------------------------------------------------------
  45. KUiSelNativePlace* KUiSelNativePlace::OpenWindow(int nPlaceId)
  46. {
  47. if (m_pSelf == NULL)
  48. {
  49. m_pSelf = new KUiSelNativePlace;
  50. if (m_pSelf)
  51. m_pSelf->Initialize();
  52. }
  53. if (m_pSelf)
  54. {
  55. m_pSelf->LoadList(nPlaceId);
  56. m_pSelf->UpdateData();
  57. UiSoundPlay(UI_SI_POPUP_OUTGAME_WND);
  58. KUiLoginBackGround::SetConfig(m_pSelf->m_szLoginBg);
  59. m_pSelf->Show();
  60. }
  61. return m_pSelf;
  62. }
  63. //--------------------------------------------------------------------------
  64. // 功能:关闭窗口
  65. //--------------------------------------------------------------------------
  66. void KUiSelNativePlace::CloseWindow(bool bDestroy)
  67. {
  68. if (m_pSelf)
  69. {
  70. if (bDestroy)
  71. {
  72. m_pSelf->Destroy();
  73. m_pSelf = NULL;
  74. }
  75. else
  76. {
  77. m_pSelf->Hide();
  78. }
  79. }
  80. }
  81. //--------------------------------------------------------------------------
  82. // 功能:初始化
  83. //--------------------------------------------------------------------------
  84. void KUiSelNativePlace::Initialize()
  85. {
  86. AddChild(&m_List);
  87. AddChild(&m_PlaceImg);
  88. AddChild(&m_Ok);
  89. AddChild(&m_Cancel);
  90. AddChild(&m_PlaceDesc);
  91. char Scheme[256];
  92. g_UiBase.GetCurSchemePath(Scheme, 256);
  93. LoadScheme(Scheme);
  94. Wnd_AddWindow(this, WL_TOPMOST);
  95. }
  96. void KUiSelNativePlace::LoadList(int nPlaceId)
  97. {
  98. if (m_pPlaceList)
  99. {
  100. free(m_pPlaceList);
  101. m_pPlaceList = NULL;
  102. }
  103. m_List.SetContent(NULL, 0, 0, 0);
  104. KIniFile File;
  105. if (!File.Load(PLACE_LIST_FILE))
  106. return;
  107. int nCount;
  108. File.GetInteger("List", "Count", 0, &nCount);
  109. if (nCount <= 0)
  110. return;
  111. m_pPlaceList = (KNativePlace*)malloc(sizeof(KNativePlace) * nCount);
  112. if (m_pPlaceList == NULL)
  113. return;
  114. char szSection[4], sBuffer[320];
  115. int nNumValid = 0;
  116. m_nLastSelPlace = 0;
  117. for (int i = 0; i < nCount; i++)
  118. {
  119. itoa(i, szSection, 10);
  120. int nValue;
  121. if (!File.GetInteger(szSection, "Id", 0, &nValue))
  122. continue;
  123. m_pPlaceList[nNumValid].nId = nValue;
  124. if (!File.GetString(szSection, "Name", "", m_pPlaceList[nNumValid].szName, sizeof(m_pPlaceList->szName)))
  125. continue;
  126. if (!File.GetString(szSection, "Img", "", m_pPlaceList[nNumValid].szImage,
  127. sizeof(m_pPlaceList[nNumValid].szImage)))
  128. continue;
  129. m_pPlaceList[nNumValid].nDescLen = 0;
  130. m_pPlaceList[nNumValid].sDesc[0] = 0;
  131. if (File.GetString(szSection, "Desc", "", sBuffer, sizeof(sBuffer)))
  132. {
  133. m_pPlaceList[nNumValid].nDescLen = strlen(sBuffer);
  134. m_pPlaceList[nNumValid].nDescLen = TEncodeText(sBuffer, m_pPlaceList[nNumValid].nDescLen);
  135. if (m_pPlaceList[nNumValid].nDescLen < sizeof(m_pPlaceList[nNumValid].sDesc))
  136. memcpy(m_pPlaceList[nNumValid].sDesc, sBuffer, m_pPlaceList[nNumValid].nDescLen);
  137. else
  138. m_pPlaceList[nNumValid].nDescLen = 0;
  139. }
  140. if (m_pPlaceList[nNumValid].nId == nPlaceId)
  141. m_nLastSelPlace = nNumValid;
  142. nNumValid ++;
  143. }
  144. if (nNumValid)
  145. {
  146. m_List.SetContent((BYTE*)m_pPlaceList, nNumValid, sizeof(KNativePlace), (int)(&((KNativePlace*)0)->szName));
  147. m_List.SetCurSel(m_nLastSelPlace);
  148. }
  149. else
  150. {
  151. free(m_pPlaceList);
  152. m_pPlaceList = NULL;
  153. }
  154. m_nLastSelPlace = 0;
  155. }
  156. //--------------------------------------------------------------------------
  157. // 功能:载入窗口的界面方案
  158. //--------------------------------------------------------------------------
  159. void KUiSelNativePlace::LoadScheme(const char* pScheme)
  160. {
  161. char Buff[128];
  162. KIniFile Ini;
  163. sprintf(Buff, "%s\%s", pScheme, SCHEME_INI_SELSERV);
  164. if (Ini.Load(Buff))
  165. {
  166. KWndShowAnimate::Init(&Ini, "Main");
  167. m_List     .Init(&Ini, "List");
  168. m_PlaceImg .Init(&Ini, "PlaceImg");
  169. m_Ok    .Init(&Ini, "OK");
  170. m_Cancel   .Init(&Ini, "Cancel");
  171. m_PlaceDesc.Init(&Ini, "PlaceDescText");
  172. Ini.GetString("Main", "LoginBg", "", m_szLoginBg, sizeof(m_szLoginBg));
  173. }
  174. }
  175. //--------------------------------------------------------------------------
  176. // 功能:窗口函数
  177. //--------------------------------------------------------------------------
  178. int KUiSelNativePlace::WndProc(unsigned int uMsg, unsigned int uParam, int nParam)
  179. {
  180. int nRet = 0;
  181. switch(uMsg)
  182. {
  183. case WND_N_BUTTON_CLICK:
  184. if (uParam == (unsigned int)(KWndWindow*)&m_Ok)
  185. OnOk();
  186. else if (uParam == (unsigned int)(KWndWindow*)&m_Cancel)
  187. OnCancel();
  188. break;
  189. case WM_KEYDOWN:
  190. if (uParam == VK_RETURN)
  191. OnOk();
  192. else if (uParam == VK_ESCAPE)
  193. OnCancel();
  194. else if (uParam == VK_UP)
  195. {
  196. nRet = m_List.GetCurSel();
  197. if (nRet  > 0)
  198. m_List.SetCurSel(nRet - 1);
  199. else if (nRet < 0)
  200. m_List.SetCurSel(0);
  201. }
  202. else if (uParam == VK_DOWN)
  203. {
  204. nRet = m_List.GetCurSel();
  205. if (nRet < m_List.GetCount() - 1)
  206. m_List.SetCurSel(nRet + 1);
  207. else if (nRet < 0)
  208. m_List.SetCurSel(0);
  209. }
  210. nRet = 1;
  211. break;
  212. case WND_N_LIST_ITEM_SEL:
  213. if (nParam != m_nLastSelPlace &&
  214. uParam == (unsigned int)(KWndWindow*)&m_List)
  215. {
  216. if (nParam >= 0)
  217. {
  218. m_nLastSelPlace = nParam;
  219. UpdateData();
  220. }
  221. else
  222. {
  223. m_List.SetCurSel(m_nLastSelPlace);
  224. }
  225. }
  226. break;
  227. case WND_N_LIST_ITEM_D_CLICK:
  228. if (nParam >= 0 && uParam == (unsigned int)(KWndWindow*)&m_List)
  229. OnOk();
  230. break;
  231. default:
  232. nRet = KWndShowAnimate::WndProc(uMsg, uParam, nParam);
  233. break;
  234. }
  235. return nRet;
  236. }
  237. //--------------------------------------------------------------------------
  238. // 功能:选择确定
  239. //--------------------------------------------------------------------------
  240. void KUiSelNativePlace::OnOk()
  241. {
  242. int nSelPlace = m_List.GetCurSel();
  243. if (m_pPlaceList && nSelPlace >= 0)
  244. {
  245. KUiNewPlayer::OpenWindow(m_pPlaceList[nSelPlace].nId);
  246. CloseWindow(false);
  247. }
  248. }
  249. //--------------------------------------------------------------------------
  250. // 功能:取消
  251. //--------------------------------------------------------------------------
  252. void KUiSelNativePlace::OnCancel()
  253. {
  254. CloseWindow(true);
  255. KUiSelPlayer::OpenWindow();
  256. }
  257. void KUiSelNativePlace::UpdateData()
  258. {
  259. if (m_pPlaceList == NULL)
  260. return;
  261. m_PlaceImg.SetImage(ISI_T_BITMAP16, m_pPlaceList[m_nLastSelPlace].szImage);
  262. m_PlaceDesc.SetText(m_pPlaceList[m_nLastSelPlace].sDesc, m_pPlaceList[m_nLastSelPlace].nDescLen);
  263. }