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

模拟服务器

开发平台:

C/C++

  1. /*****************************************************************************************
  2. // 界面--选择游戏服务器窗口
  3. // Copyright : Kingsoft 2002
  4. // Author :   Wooy(Wu yue)
  5. // CreateTime: 2002-8-12
  6. *****************************************************************************************/
  7. #include "KWin32.h"
  8. #include "KIniFile.h"
  9. #include "../Elem/WndMessage.h"
  10. #include "../Elem/Wnds.h"
  11. #include "../UiShell.h"
  12. #include "UiInit.h"
  13. #include "UiLoginBg.h"
  14. #include "UiConnectInfo.h"
  15. #include "UiSelServer.h"
  16. #include "../UiSoundSetting.h"
  17. #include "../UiBase.h"
  18. #include "../../Login/Login.h"
  19. #include <crtdbg.h>
  20. #define SCHEME_INI_SELSERV "选服务器.ini"
  21. #define SERVER_LIST_FILE "\Settings\ServerList.ini"
  22. KUiSelServer* KUiSelServer::m_pSelf = NULL;
  23. //--------------------------------------------------------------------------
  24. // 功能:构造函数
  25. //--------------------------------------------------------------------------
  26. KUiSelServer::KUiSelServer()
  27. {
  28. m_pServList = NULL;
  29. m_szLoginBg[0] = 0;
  30. m_bSelRegion = true;
  31. m_nRegionIndex = 0;
  32. }
  33. KUiSelServer::~KUiSelServer()
  34. {
  35. m_List.SetContent(NULL, 0, 0, 0);
  36. if (m_pServList)
  37. {
  38. free(m_pServList);
  39. m_pServList = NULL;
  40. }
  41. }
  42. //--------------------------------------------------------------------------
  43. // 功能:打开窗口,返回唯一的一个类对象实例
  44. //--------------------------------------------------------------------------
  45. KUiSelServer* KUiSelServer::OpenWindow()
  46. {
  47. if (m_pSelf == NULL)
  48. {
  49. m_pSelf = new KUiSelServer;
  50. if (m_pSelf)
  51. m_pSelf->Initialize();
  52. }
  53. if (m_pSelf)
  54. {
  55. UiSoundPlay(UI_SI_POPUP_OUTGAME_WND);
  56. KUiLoginBackGround::SetConfig(m_pSelf->m_szLoginBg);
  57. m_pSelf->m_bSelRegion = true;
  58. m_pSelf->GetList();
  59. m_pSelf->Show();
  60. }
  61. return m_pSelf;
  62. }
  63. //--------------------------------------------------------------------------
  64. // 功能:关闭窗口
  65. //--------------------------------------------------------------------------
  66. void KUiSelServer::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 KUiSelServer::Initialize()
  85. {
  86. AddChild(&m_List);
  87. AddChild(&m_ScrollBar);
  88. AddChild(&m_Login);
  89. AddChild(&m_Cancel);
  90. m_List.SetScrollbar(&m_ScrollBar);
  91. char Scheme[256];
  92. g_UiBase.GetCurSchemePath(Scheme, 256);
  93. LoadScheme(Scheme);
  94. Wnd_AddWindow(this, WL_TOPMOST);
  95. }
  96. void KUiSelServer::GetList()
  97. {
  98. m_List.SetContent(NULL, 0, 0, 0);
  99. if (m_pServList)
  100. {
  101. free(m_pServList);
  102. m_pServList = NULL;
  103. }
  104. int nCount, nSel;
  105. if (m_bSelRegion)
  106. {
  107. m_pServList = g_LoginLogic.GetServerRegionList(nCount, m_nRegionIndex);
  108. if (m_pServList)
  109. {
  110. m_List.SetContent((BYTE*)m_pServList, nCount, sizeof(KLoginServer), 0);
  111. m_List.SetCurSel(m_nRegionIndex);
  112. }
  113. }
  114. else
  115. {
  116. g_LoginLogic.LoadLoginChoice();
  117. m_pServList = g_LoginLogic.GetServerList(m_nRegionIndex, nCount, nSel);
  118. if (m_pServList)
  119. {
  120. m_List.SetContent((BYTE*)m_pServList, nCount, sizeof(KLoginServer), 0);
  121. m_List.SetCurSel(nSel);
  122. }
  123. }
  124. }
  125. //--------------------------------------------------------------------------
  126. // 功能:载入窗口的界面方案
  127. //--------------------------------------------------------------------------
  128. void KUiSelServer::LoadScheme(const char* pScheme)
  129. {
  130. char Buff[128];
  131. KIniFile Ini;
  132. sprintf(Buff, "%s\%s", pScheme, SCHEME_INI_SELSERV);
  133. if (Ini.Load(Buff))
  134. {
  135. KWndShowAnimate::Init(&Ini, "Main");
  136. m_List     .Init(&Ini, "List");
  137. m_ScrollBar.Init(&Ini, "Scroll");
  138. m_Login    .Init(&Ini, "Login");
  139. m_Cancel   .Init(&Ini, "Cancel");
  140. Ini.GetString("Main", "LoginBg", "", m_szLoginBg, sizeof(m_szLoginBg));
  141. }
  142. }
  143. //--------------------------------------------------------------------------
  144. // 功能:窗口函数
  145. //--------------------------------------------------------------------------
  146. int KUiSelServer::WndProc(unsigned int uMsg, unsigned int uParam, int nParam)
  147. {
  148. int nRet = 0;
  149. switch(uMsg)
  150. {
  151. case WND_N_BUTTON_CLICK:
  152. OnClickButton((KWndButton*)(KWndWindow*)uParam);
  153. break;
  154. case WND_N_SCORLLBAR_POS_CHANGED:
  155. m_List.SetTopItemIndex(nParam);
  156. break;
  157. case WM_KEYDOWN:
  158. nRet = OnKeyDown(uParam);
  159. break;
  160. case WND_N_LIST_ITEM_D_CLICK:
  161. if (nParam >= 0 && uParam == (unsigned int)(KWndWindow*)&m_List)
  162. OnLogin();
  163. break;
  164. default:
  165. nRet = KWndShowAnimate::WndProc(uMsg, uParam, nParam);
  166. }
  167. return nRet;
  168. }
  169. int KUiSelServer::OnKeyDown(unsigned int uKey)
  170. {
  171. int nRet = 1;
  172. KWndWindow* pToActive = NULL;
  173. switch (uKey)
  174. {
  175. case VK_RETURN:
  176. if (m_Cancel.IsButtonActive())
  177. OnCancel();
  178. else
  179. OnLogin();
  180. break;
  181. case VK_ESCAPE:
  182. OnCancel();
  183. break;
  184. case VK_LEFT:
  185. if (m_Login.IsButtonActive() == 0)
  186. pToActive = &m_Login;
  187. break;
  188. case VK_RIGHT:
  189. if (m_Cancel.IsButtonActive() == 0)
  190. pToActive = &m_Cancel;
  191. break;
  192. case VK_UP:
  193. nRet = m_List.GetCurSel();
  194. if (nRet  > 0)
  195. m_List.SetCurSel(nRet - 1);
  196. else if (nRet < 0)
  197. m_List.SetCurSel(0);
  198. m_ScrollBar.SetScrollPos(m_List.GetTopItemIndex());
  199. nRet = 1;
  200. break;
  201. case VK_DOWN:
  202. nRet = m_List.GetCurSel();
  203. if (nRet < m_List.GetCount() - 1)
  204. m_List.SetCurSel(nRet + 1);
  205. else if (nRet < 0)
  206. m_List.SetCurSel(0);
  207. m_ScrollBar.SetScrollPos(m_List.GetTopItemIndex());
  208. nRet = 1;
  209. break;
  210. default:
  211. nRet = 0;
  212. break;
  213. }
  214. if (pToActive)
  215. pToActive->SetCursorAbove();
  216. return nRet;
  217. }
  218. void KUiSelServer::OnClickButton(KWndButton* pBtn)
  219. {
  220. if (pBtn == &m_Login)
  221. OnLogin();
  222. else if(pBtn == &m_Cancel)
  223. OnCancel();
  224. }
  225. //--------------------------------------------------------------------------
  226. // 功能:登陆游戏世界服务器
  227. //--------------------------------------------------------------------------
  228. void KUiSelServer::OnLogin()
  229. {
  230. int nSelServer = m_List.GetCurSel();
  231. if (m_pServList && nSelServer >= 0)
  232. {
  233. if (m_bSelRegion)
  234. {
  235. m_nRegionIndex = nSelServer;
  236. m_bSelRegion = false;
  237. GetList();
  238. }
  239. else
  240. {
  241.         g_LoginLogic.SetAccountServer(m_pServList[nSelServer]);
  242. g_LoginLogic.CreateConnection(m_pServList[nSelServer].Address);
  243. KUiConnectInfo::OpenWindow(CI_MI_CONNECTING, LL_S_WAIT_INPUT_ACCOUNT);
  244. CloseWindow(false);
  245. }
  246. }
  247. }
  248. //--------------------------------------------------------------------------
  249. // 功能:取消
  250. //--------------------------------------------------------------------------
  251. void KUiSelServer::OnCancel()
  252. {
  253. if (m_bSelRegion)
  254. {
  255. CloseWindow(true);
  256. KUiInit::OpenWindow(false, false);
  257. }
  258. else
  259. {
  260. m_bSelRegion = true;
  261. GetList();
  262. }
  263. }