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

模拟服务器

开发平台:

C/C++

  1. /********************************************************************
  2. File        : UiStrengthRank.cpp
  3. Creator     : Fyt(Fan Zhanpeng)
  4. create data : 08-11-2003(mm-dd-yyyy)
  5. Description : 排名窗口的实现部分
  6. *********************************************************************/
  7. #include "KWin32.h"
  8. #include "../Elem/Wnds.h"
  9. #include "../Elem/WndMessage.h"
  10. #include "../Elem/WndMessageListBox.h"
  11. #include "../UiBase.h"
  12. #include "../UiSoundSetting.h"
  13. #include "../../../core/src/gamedatadef.h"
  14. #include "../../../core/src/CoreShell.h"
  15. #include "../../../Engine/src/Text.h"
  16. #include "../../../Engine/src/KFilePath.h"
  17. #include "UiStrengthRank.h"
  18. #define INDEX_AND_RANK_DATA_INI "排名的临时文件.ini"
  19. #define INDEX_AND_RANK_MAPPING "\Ui\排名ID.ini"
  20. #define STRENGTH_RANK_INI "排名.ini"
  21. //发送获取信息请求以后,得不到响应的超时时间
  22. #define GET_RANK_TIME_OUT 10000
  23. extern iCoreShell* g_pCoreShell;
  24. KUiStrengthRank* KUiStrengthRank::m_pSelf;
  25. KLinkStruct<KRankIndexNode> KUiStrengthRank::m_IndexData;
  26. KLinkStruct<KRankNode>      KUiStrengthRank::m_RankData;
  27. KIniFile                    KUiStrengthRank::m_IndexIDIni;
  28. BOOL                        KUiStrengthRank::m_bIsIndexDataChange = FALSE;
  29. BOOL                        KUiStrengthRank::m_bIsRankDataChange = FALSE;
  30. extern IInlinePicEngineSink* g_pIInlinePicSink;
  31. //////////////////////////////////////////////////////////////////////
  32. // Construction/Destruction
  33. //////////////////////////////////////////////////////////////////////
  34. KUiStrengthRank::KUiStrengthRank()
  35. {
  36. m_pCurrentIndexNode= NULL;
  37. m_pIDontThinkSo  = NULL;
  38. m_pLastGettimes = NULL;
  39. m_uLastGetRankTime = 0;
  40. m_uLastGetIndexTime  = 0;
  41. m_nLastIndex = -1;
  42. }
  43. KUiStrengthRank::~KUiStrengthRank()
  44. {
  45. if(m_pLastGettimes)
  46. {
  47. delete(m_pLastGettimes);
  48. m_pLastGettimes = NULL;
  49. }
  50. }
  51. /****************************************************************************
  52. *功能:如果窗口正被显示,则返回实例指针
  53. *****************************************************************************/
  54. KUiStrengthRank* KUiStrengthRank::GetIfVisible()
  55. {
  56. if (m_pSelf && m_pSelf->IsVisible())
  57. return m_pSelf;
  58. return NULL;
  59. }
  60. /****************************************************************************
  61. *功能:打开窗口,返回唯一的一个类对象实例
  62. *****************************************************************************/
  63. KUiStrengthRank* KUiStrengthRank::OpenWindow()
  64. {
  65. if (m_pSelf == NULL)
  66. {
  67. m_pSelf = new KUiStrengthRank;
  68. if (m_pSelf)
  69. m_pSelf->Initialize();
  70. }
  71. if (m_pSelf)
  72. {
  73. UiSoundPlay(UI_SI_WND_OPENCLOSE);
  74. m_pSelf->BringToTop();
  75. m_pSelf->Show();
  76. }
  77. return m_pSelf;
  78. }
  79. /****************************************************************************
  80. *功能:打开窗口,显示默认数据,返回唯一的一个类对象实例
  81. *****************************************************************************/
  82. KUiStrengthRank* KUiStrengthRank::OpenDefaultWindow(int nId)
  83. {
  84. if (m_pSelf == NULL)
  85. {
  86. m_pSelf = new KUiStrengthRank;
  87. if (m_pSelf)
  88. m_pSelf->Initialize();
  89. }
  90. if (m_pSelf)
  91. {
  92. UiSoundPlay(UI_SI_WND_OPENCLOSE);
  93. m_pSelf->BringToTop();
  94. m_pSelf->Show();
  95. m_pSelf->ArrangeDefaultData();
  96. }
  97. return m_pSelf;
  98. }
  99. /****************************************************************************
  100. *功能:安排默认数据的显示
  101. *****************************************************************************/
  102. void KUiStrengthRank::ArrangeDefaultData()
  103. {
  104. KIniFile Ini;
  105. if(Ini.Load(INDEX_AND_RANK_MAPPING))
  106. {
  107. KRankIndex *pIndex = NULL;
  108. int nCount;
  109.      m_IndexData.Clear();
  110. m_pCurrentIndexNode = NULL;
  111.      m_RankData.Clear();
  112. Ini.GetInteger("Main", "ListCount", 0, &nCount);
  113. pIndex = new KRankIndex[nCount];
  114. if(pIndex)
  115. {
  116.      for(int i=0;i < nCount;i++)
  117.     {
  118.              pIndex[i].usIndexId = i + 1;
  119.              pIndex[i].bValueAppened = 1;
  120.              pIndex[i].bSortFlag = 1;
  121.     }
  122. NewIndexArrive(nCount, pIndex);
  123. m_pCurrentIndexNode = m_IndexData.Reset();
  124. delete(pIndex);
  125. }
  126. }
  127. }
  128. /****************************************************************************
  129. *功能:初始化窗口
  130. *****************************************************************************/
  131. void KUiStrengthRank::Initialize()
  132. {
  133. AddChild(&m_BtnClose);
  134. AddChild(&m_IndexList);
  135. AddChild(&m_IndexScroll);
  136. AddChild(&m_RankList);
  137. m_IndexList.SetScrollbar(&m_IndexScroll);
  138. AddChild(&m_RankScroll);
  139. m_RankList.SetScrollbar(&m_RankScroll);
  140. m_IndexList.SetTopItemIndex(0);
  141. char Scheme[256];
  142. g_UiBase.GetCurSchemePath(Scheme, 256);
  143. LoadScheme(Scheme);
  144.     g_pIInlinePicSink->AddCustomInlinePic(m_usSteadyPic, m_szSteadyPicPath);
  145. g_pIInlinePicSink->AddCustomInlinePic(m_usDownPic, m_szDownPicPath);
  146. g_pIInlinePicSink->AddCustomInlinePic(m_usUpPic, m_szUpPicPath);
  147. int nWidth, nHeight;
  148. m_RankList.GetSize(&nWidth, &nHeight);
  149. m_nLineLen = nWidth * 2 / m_nFontSize - 1;
  150. if(m_pLastGettimes == NULL && m_IndexData.GetCount())
  151. {
  152. m_pLastGettimes = new unsigned int[m_IndexData.GetCount()];
  153. if(m_pLastGettimes)
  154.     memset(m_pLastGettimes, 0, m_IndexData.GetCount());
  155. }
  156. Wnd_AddWindow(this);
  157. }
  158. /****************************************************************************
  159. *功能:关闭窗口,同时可以选则是否删除对象实例
  160. *****************************************************************************/
  161. void KUiStrengthRank::CloseWindow(bool bDestory)
  162. {
  163. if (m_pSelf)
  164. {
  165. m_pSelf->Hide();
  166. m_pSelf->ReleaseData();
  167. if (bDestory)
  168. {
  169. m_pSelf->ReleasePic();
  170. m_pSelf->Destroy();
  171. m_pSelf = NULL;
  172. }
  173. }
  174. }
  175. /****************************************************************************
  176. *功能:更新控件数据的统一调度函数
  177. *****************************************************************************/
  178. void KUiStrengthRank::Breathe()
  179. {
  180.     if(m_bIsIndexDataChange)
  181.     {
  182.     ConstructIndexView();
  183.     m_bIsIndexDataChange = FALSE;
  184. if (m_nLastIndex < 0 || m_nLastIndex >= m_IndexData.GetCount())
  185. {
  186. m_IndexList.SetCurSel(0);
  187. }
  188.     }
  189.     if(m_bIsRankDataChange)
  190.     {
  191.     ConstructRankView();
  192.     m_bIsRankDataChange = FALSE;
  193.     }
  194. }
  195. /****************************************************************************
  196. *功能:响应窗口消息的窗口函数
  197. *****************************************************************************/
  198. int KUiStrengthRank::WndProc(unsigned int uMsg, unsigned int uParam, int nParam)
  199. {
  200. int nRet = 0;
  201. switch(uMsg)
  202. {
  203. case WND_N_LIST_ITEM_SEL:
  204. if (uParam == (unsigned int)(KWndWindow*)&m_IndexList)
  205. {
  206. int nIndex = nParam;
  207. if (nIndex < 0)
  208. {
  209. if (m_nLastIndex >= 0)
  210. m_IndexList.SetCurSel(m_nLastIndex);
  211. }
  212. else if (nIndex != m_nLastIndex)
  213. {
  214. m_nLastIndex = nIndex;
  215. // Get the content of "nParam" index.
  216. KRankIndexNode *SelNode = m_IndexData.GetItem(nIndex);
  217. if(SelNode)
  218. {
  219. m_pCurrentIndexNode = SelNode;
  220.     UpdateRankData(SelNode->usIndexId);
  221. }
  222. }
  223. }
  224. break;
  225.     case WND_N_SCORLLBAR_POS_CHANGED:
  226. if (uParam == (unsigned int)(KWndWindow*)&m_IndexScroll)
  227. m_IndexList.SetTopItemIndex(nParam);
  228. else if (uParam == (unsigned int)(KWndWindow*)&m_RankScroll)
  229. m_RankList.SetFirstShowLine(nParam);
  230. break;
  231.     case WND_N_BUTTON_CLICK:
  232. if (uParam == (unsigned int)(KWndWindow*)&m_BtnClose)
  233. CloseWindow(false);
  234. break;
  235. case WM_KEYDOWN:
  236. if(uParam == VK_ESCAPE)
  237. CloseWindow(false);
  238. break;
  239. default:
  240. nRet  = KWndShowAnimate::WndProc(uMsg, uParam, nParam);
  241. }
  242. return nRet;
  243. }
  244. /****************************************************************************
  245. *功能:载入界面方案
  246. *****************************************************************************/
  247. void KUiStrengthRank::LoadScheme(const char* pScheme)
  248. {
  249. if (m_pSelf)
  250. {
  251. char Buff[128];
  252. KIniFile Ini;
  253. sprintf(Buff, "%s\%s", pScheme, STRENGTH_RANK_INI);
  254. if (Ini.Load(Buff))
  255. {
  256. m_pSelf->Init(&Ini, "Main");
  257. m_pSelf->m_BtnClose.Init(&Ini, "BtnClose");
  258. m_pSelf->m_IndexList.Init(&Ini, "IndexList");
  259. m_pSelf->m_IndexScroll.Init(&Ini, "IndexScroll");
  260. m_pSelf->m_RankScroll.Init(&Ini, "MessageScroll");
  261. m_pSelf->m_RankList.Init(&Ini, "MessageList");
  262. Ini.GetString("Main", "Color", "0,0,0", Buff, sizeof(Buff));
  263. m_pSelf->m_uColor = GetColor(Buff);
  264. Ini.GetInteger("MessageList", "Font", 12, &m_pSelf->m_nFontSize);
  265. Ini.GetString("Main", "UpPic", "", m_pSelf->m_szUpPicPath, sizeof(m_pSelf->m_szUpPicPath));
  266. Ini.GetString("Main", "DownPic", "", m_pSelf->m_szDownPicPath, sizeof(m_pSelf->m_szDownPicPath));
  267. Ini.GetString("Main", "SteadyPic", "", m_pSelf->m_szSteadyPicPath, sizeof(m_pSelf->m_szSteadyPicPath));
  268. Ini.GetInteger("Main", "DefaultID", 0, &m_pSelf->m_nDefaultID);
  269. }
  270. }
  271. }
  272. /****************************************************************************
  273. *功能:卸载图形文件
  274. *****************************************************************************/
  275. void KUiStrengthRank::ReleasePic()
  276. {
  277. g_pIInlinePicSink->RemoveCustomInlinePic(m_usUpPic);
  278. g_pIInlinePicSink->RemoveCustomInlinePic(m_usDownPic);
  279. g_pIInlinePicSink->RemoveCustomInlinePic(m_usSteadyPic);
  280. }
  281. /****************************************************************************
  282. *功能:释放数据和重置显示
  283. *****************************************************************************/
  284. void KUiStrengthRank::ReleaseData()
  285. {
  286. m_IndexData.Clear();
  287. m_RankData.Clear();
  288. m_pCurrentIndexNode = NULL;
  289. m_IndexList.SetContent(m_pIDontThinkSo,0,0,0);
  290. m_RankList.Clear();
  291. if(m_pIDontThinkSo)
  292. {
  293. delete(m_pIDontThinkSo);
  294. m_pIDontThinkSo = NULL;
  295. }
  296. m_nLastIndex = -1;
  297. }
  298. /****************************************************************************
  299. *功能:更新索引数据-有INI就取INI,没有就问Core要,WAKAKA
  300. *****************************************************************************/
  301. //void KUiStrengthRank::UpdateIndexData()
  302. //{
  303. //    KIniFile Ini;
  304. //
  305. // m_IndexData.Clear();
  306. // if(!(Ini.Load(INDEX_AND_RANK_DATA_INI) && LoadIndexIni(&Ini)))
  307. // SendGetIndexToCore();
  308. //}
  309. /****************************************************************************
  310. *功能:更新排名数据-有INI就取INI,没有就问Core要,WAKAKA
  311. *****************************************************************************/
  312. void KUiStrengthRank::UpdateRankData(int nID)
  313. {
  314. KIniFile Ini;
  315. m_RankData.Clear();
  316. m_RankList.Clear();
  317. char szFileName[128];
  318. sprintf(szFileName, "%s\%s", g_UiBase.GetUserTempDataFolder(), INDEX_AND_RANK_DATA_INI);
  319. if(!(Ini.Load(szFileName) && LoadRankIni(&Ini, nID)))
  320. SendGetRankToCore(nID);
  321. }
  322. /****************************************************************************
  323. *功能:从INI中载入索引数据
  324. *****************************************************************************/
  325. BOOL KUiStrengthRank::LoadIndexIni(KIniFile *Ini)
  326. {
  327. BOOL       nRet   = FALSE;
  328. KRankIndex *pData = NULL;
  329. int        nCount, i, j;
  330. char       szKey[32];
  331. KRankIndex NewNode;
  332. if(Ini->IsSectionExist("Index"))
  333. {
  334. Ini->GetInteger("Index", "Count", 0, &nCount);
  335. if(!pData)
  336.     pData = new KRankIndex[nCount];
  337. if(pData && nCount)
  338. {
  339.             for(i = 1;i <= nCount;i++)
  340.         {
  341. memset(&NewNode, 0, sizeof(KRankIndex));
  342. sprintf(szKey, "%d_ID", i);
  343. Ini->GetInteger("Index", szKey, 0, &j);
  344. NewNode.usIndexId = (unsigned short)j;
  345. sprintf(szKey, "%d_Appened", i);
  346. Ini->GetInteger("Index", szKey, 0, &j);
  347. NewNode.bValueAppened = (j != 0);
  348. sprintf(szKey, "%d_SortFlag", i);
  349. Ini->GetInteger("Index", szKey, 0, &j);
  350. NewNode.bSortFlag = (j != 0);
  351.                 memcpy(pData + i - 1, &NewNode, sizeof(KRankIndex));
  352.         }
  353. AddIndex(nCount, pData);
  354. m_bIsIndexDataChange = nRet = TRUE;
  355. delete(pData);
  356. pData = NULL;
  357. }
  358. }
  359. return nRet;
  360. }
  361. /****************************************************************************
  362. *功能:从INI中载入排名数据
  363. *****************************************************************************/
  364. BOOL KUiStrengthRank::LoadRankIni(KIniFile *Ini, int nID)
  365. {
  366. char szSection[32], szKey[32];
  367. BOOL nRet           = FALSE;
  368. KRankMessage *pData = NULL;
  369. KRankMessage  NewNode;
  370.     int  nCount, i;
  371. sprintf(szSection, "%d", nID);
  372. if(Ini->IsSectionExist(szSection))
  373. {
  374. Ini->GetInteger(szSection, "Count", 0, &nCount);
  375. if(!pData)
  376.     pData = new KRankMessage[nCount];
  377. if(pData && nCount)
  378. {
  379.         for(i = 1;i <= nCount;i++)
  380.         {
  381. memset(&NewNode, 0, sizeof(KRankMessage));
  382.          sprintf(szKey, "%d", i);
  383.     Ini->GetStruct(szSection, szKey, &NewNode, sizeof(KRankMessage));
  384. memcpy(pData + i - 1, &NewNode, sizeof(KRankMessage));
  385.         }
  386. AddRank((nID << 16) + nCount, pData);
  387. m_bIsRankDataChange = nRet = TRUE;
  388. delete(pData);
  389. pData = NULL;
  390. }
  391. }
  392. return nRet;
  393. }
  394. /****************************************************************************
  395. *功能:从Core那里抢劫索引数据
  396. *****************************************************************************/
  397. //void KUiStrengthRank::SendRobIndexToCore()
  398. //{
  399. // SendGetIndexToCore();
  400. //}
  401. /****************************************************************************
  402. *功能:从Core那里获取索引数据
  403. *****************************************************************************/
  404. //void KUiStrengthRank::SendGetIndexToCore()
  405. //{
  406. // if(g_pCoreShell && IR_GetCurrentTime() - m_uLastGetIndexTime > GET_RANK_TIME_OUT)
  407. // {
  408. // m_uLastGetIndexTime = IR_GetCurrentTime();
  409. // g_pCoreShell->OperationRequest(GOI_QUERY_RANK_INFORMATION, 0, TRUE);
  410. // }
  411. //}
  412. /****************************************************************************
  413. *功能:从Core那里获取排名数据
  414. *****************************************************************************/
  415. void KUiStrengthRank::SendGetRankToCore(int nID)
  416. {
  417. if(g_pCoreShell && m_pLastGettimes && IR_GetCurrentTime() - m_pLastGettimes[m_nLastIndex] > GET_RANK_TIME_OUT)
  418. {
  419. m_pLastGettimes[m_nLastIndex] = IR_GetCurrentTime();
  420. g_pCoreShell->OperationRequest(GOI_QUERY_RANK_INFORMATION, (unsigned int)nID, 0);
  421. }
  422. }
  423. /****************************************************************************
  424. *功能:把Index的数据(m_data)构造进去m_indexList里面,那就可以绘制的时候显示出来
  425. *****************************************************************************/
  426. void KUiStrengthRank::ConstructIndexView()
  427. {
  428. KRankIndexNode *pNode;
  429. unsigned char  *pPos;
  430. int i, nCount;
  431. nCount = KUiStrengthRank::m_IndexData.GetCount();
  432. pNode  = KUiStrengthRank::m_IndexData.Reset();
  433. if(m_pIDontThinkSo)
  434. {
  435. delete(m_pIDontThinkSo);
  436. m_pIDontThinkSo = NULL;
  437. }
  438. m_pIDontThinkSo = new unsigned char[MAX_RANK_MESSAGE_LENGTH * nCount];
  439. if(m_pIDontThinkSo)
  440. {
  441. pPos = m_pIDontThinkSo;
  442.      for(i = 0;i < nCount;i++)
  443.      {
  444. memcpy(pPos, pNode->szMsg, pNode->nMsgLen);
  445. pPos[pNode->nMsgLen] = 0;
  446.     pNode = KUiStrengthRank::m_IndexData.NextItem();
  447. pPos += MAX_RANK_MESSAGE_LENGTH;
  448.     }
  449. m_IndexList.SetContent(m_pIDontThinkSo, nCount, MAX_RANK_MESSAGE_LENGTH, 0);
  450. }
  451. }
  452. /****************************************************************************
  453. *功能:把Rank的排名数据构造进去m_RankList里面,以可以绘制的时候显示出来
  454. *****************************************************************************/
  455. void KUiStrengthRank::ConstructRankView()
  456. {
  457. int i, nCount;
  458. KRankNode *pNode;
  459. nCount = KUiStrengthRank::m_RankData.GetCount();
  460. pNode  = KUiStrengthRank::m_RankData.Reset();
  461. m_RankList.SetFirstShowLine(0);
  462. if(m_pCurrentIndexNode && (m_pCurrentIndexNode->bValueAppened || m_pCurrentIndexNode->bSortFlag) )
  463. {
  464. char szBuf[32];
  465.      for(i = 0;i < nCount;i++)
  466.     {
  467. pNode->szMsg[pNode->usMsgLen] = KTC_TAB;
  468. pNode->usMsgLen ++;
  469. //构造额外数据字符串
  470. if(m_pCurrentIndexNode->bValueAppened)
  471. {
  472.      sprintf(szBuf, "%d", pNode->nValueAppend);
  473.     //有单位就写下单位
  474.     if(m_pCurrentIndexNode->szUnit[0])
  475.     {
  476.      sprintf(szBuf, "%s%s", szBuf, m_pCurrentIndexNode->szUnit);
  477.     }
  478.                 //构造好的字符串扩展进排名字符串里
  479.     memcpy(pNode->szMsg + pNode->usMsgLen, szBuf, strlen(szBuf));
  480.     pNode->usMsgLen += strlen(szBuf);
  481. }
  482.             //加进上升持平下降图片
  483. if(m_pCurrentIndexNode->bSortFlag)
  484. {
  485.          pNode->szMsg[pNode->usMsgLen] = KTC_INLINE_PIC;
  486.         if(pNode->nValueAppend > 0)
  487.     {
  488.              *((short *)(&pNode->szMsg[pNode->usMsgLen + 1])) = m_usUpPic;
  489.     }
  490.     else if(pNode->nValueAppend < 0)
  491.     {
  492.          *((short *)(&pNode->szMsg[pNode->usMsgLen + 1])) = m_usDownPic;
  493.     }
  494.     else
  495.     {
  496.          *((short *)(&pNode->szMsg[pNode->usMsgLen + 1])) = m_usSteadyPic;
  497.     }
  498.     pNode->usMsgLen += 3;
  499. }
  500. //展开
  501. pNode->usMsgLen = TDrawOutString(pNode->szMsg, pNode->usMsgLen,
  502.                              m_nLineLen, m_nFontSize);
  503.     m_RankList.AddOneMessage(pNode->szMsg, pNode->usMsgLen, 0);
  504.     pNode = KUiStrengthRank::m_RankData.NextItem();
  505.     }
  506. }
  507. else
  508. {
  509. for(i = 0;i < nCount;i++)
  510.     {
  511. pNode->usMsgLen = TDrawOutString(pNode->szMsg, pNode->usMsgLen,
  512.                              m_nLineLen, m_nFontSize);
  513.     m_RankList.AddOneMessage(pNode->szMsg, pNode->usMsgLen, 0);
  514.     pNode = KUiStrengthRank::m_RankData.NextItem();
  515.     }
  516. }
  517. }
  518. /****************************************************************************
  519. *功能:新的索引消息来了
  520. *****************************************************************************/
  521. void KUiStrengthRank::NewIndexArrive(unsigned int uParam, struct KRankIndex *pIndex)
  522. {
  523. if(m_pSelf)
  524. {
  525.      if(m_pSelf->m_pLastGettimes)
  526.      {
  527.     delete(m_pSelf->m_pLastGettimes);
  528.     m_pSelf->m_pLastGettimes = NULL;
  529.     }
  530.     if(uParam > 0)
  531.     {
  532.      m_pSelf->m_pLastGettimes = new unsigned int[uParam];
  533.     if(m_pSelf->m_pLastGettimes)
  534. {
  535. memset(m_pSelf->m_pLastGettimes, 0, sizeof(unsigned int) * uParam);
  536. }
  537.      }
  538. }
  539. AddIndex(uParam, pIndex);
  540. //StoreNewDataToTempFile(uParam, pIndex);
  541. }
  542. /****************************************************************************
  543. *功能:新的排名信息来了
  544. *****************************************************************************/
  545. void KUiStrengthRank::NewRankArrive(unsigned int uParam, KRankMessage *pRankData)
  546. {
  547. AddRank(uParam, pRankData);
  548. StoreNewDataToTempFile(uParam, pRankData);
  549. }
  550. /****************************************************************************
  551. *功能:添加索引信息
  552. *****************************************************************************/
  553. void KUiStrengthRank::AddIndex(unsigned int uParam, struct KRankIndex *pIndex)
  554. {
  555. KRankIndex  *pIncome;
  556. KRankIndexNode Node;
  557. char szKey[32];
  558. int nCount, i;
  559. nCount = uParam;
  560. pIncome = pIndex;
  561. if(!m_IndexIDIni.IsSectionExist("Index"))
  562. m_IndexIDIni.Load(INDEX_AND_RANK_MAPPING);
  563.     for(i = 0;i < nCount;i++)
  564. {
  565. memcpy(&Node, pIncome, sizeof(KRankIndex));
  566. sprintf(szKey, "%d_Title", pIncome->usIndexId);
  567.     m_IndexIDIni.GetString("Index", szKey, "", Node.szMsg,
  568.                          MAX_RANK_MESSAGE_LENGTH);
  569. Node.nMsgLen = strlen(Node.szMsg);
  570. sprintf(szKey, "%d_Unit", pIncome->usIndexId);
  571. m_IndexIDIni.GetString("Index", szKey, "", Node.szUnit, sizeof(Node.szUnit));
  572. m_IndexData.AddItem(Node);
  573. pIncome++;
  574. }
  575. m_bIsIndexDataChange = TRUE;
  576. }
  577. /****************************************************************************
  578. *功能:添加排名信息
  579. *****************************************************************************/
  580. void KUiStrengthRank::AddRank(unsigned int uParam, KRankMessage *pRankData)
  581. {
  582. KRankMessage  *pIncome;
  583. int nID, nCount, i;
  584. KRankNode Node;
  585. pIncome = pRankData;
  586. nCount  = uParam & 0xffff;
  587. nID     = uParam >> 16;
  588. if(m_pSelf && m_pSelf->m_pCurrentIndexNode && nID == m_pSelf->m_pCurrentIndexNode->usIndexId)
  589. {
  590. for(i = 0;i < nCount;i++)
  591.     {
  592. if(pIncome->szMsg[0])
  593. {
  594.          memcpy(&Node, pIncome, sizeof(KRankMessage));
  595.         m_RankData.AddItem(Node);
  596. }
  597.     pIncome++;
  598.     }
  599. m_bIsRankDataChange = TRUE;
  600. }
  601. }
  602. /****************************************************************************
  603. *功能:把索引和排名记录进临时文件
  604. *****************************************************************************/
  605. void KUiStrengthRank::StoreTempIni()
  606. {
  607. KIniFile Ini;
  608. int  nCount, i;
  609. KRankNode *pNode;
  610. KRankIndexNode *pIndexNode;
  611. char szSection[32], szKey[32], szFileName[128];
  612.     sprintf(szFileName, "%s\%s", g_UiBase.GetUserTempDataFolder(), INDEX_AND_RANK_DATA_INI);
  613.     Ini.Load(szFileName);
  614. //先写索引
  615. nCount = KUiStrengthRank::m_IndexData.GetCount();
  616. if(nCount)
  617. {
  618. Ini.WriteInteger("Index", "Count", nCount);
  619. pIndexNode = KUiStrengthRank::m_IndexData.Reset();
  620. for(i = 0;i < nCount;i++)
  621. {
  622. sprintf(szKey, "%d_ID", i + 1);
  623. Ini.WriteInteger("Index", szKey, pIndexNode->usIndexId);
  624. sprintf(szKey, "%d_Appened", i + 1);
  625. Ini.WriteInteger("Index", szKey, pIndexNode->bValueAppened);
  626. sprintf(szKey, "%d_SortFlag", i + 1);
  627. Ini.WriteInteger("Index", szKey, pIndexNode->bSortFlag);
  628. pIndexNode = KUiStrengthRank::m_IndexData.NextItem();
  629. if(!pIndexNode) break;
  630. }
  631. }
  632.     //然后写排名
  633. nCount = KUiStrengthRank::m_RankData.GetCount();
  634. if(nCount && m_pSelf->m_pCurrentIndexNode)
  635. {
  636. sprintf(szSection, "%d", m_pSelf->m_pCurrentIndexNode->usIndexId);
  637. Ini.WriteInteger(szSection, "Count", nCount);
  638. pNode = KUiStrengthRank::m_RankData.Reset();
  639. for(i = 0;i < nCount;i++)
  640. {
  641. sprintf(szKey, "%d", i + 1);
  642. Ini.WriteStruct(szSection, szKey, pNode, sizeof(KRankMessage));
  643. pNode = KUiStrengthRank::m_RankData.NextItem();
  644. if(!pNode) break;
  645. }
  646. }
  647. Ini.Save(szFileName);
  648. }
  649. /****************************************************************************
  650. *功能:把新收到的索引资料存到临时文件
  651. *****************************************************************************/
  652. void KUiStrengthRank::StoreNewDataToTempFile(unsigned int uParam, KRankIndex *pInData)
  653. {
  654. KIniFile Ini;
  655. char szKey[32], szFileName[128];
  656. KRankIndex *pIncome;
  657. int  nCount, nIniCount, i;
  658.     nCount = uParam;
  659. pIncome= pInData;
  660. sprintf(szFileName, "%s\%s", g_UiBase.GetUserTempDataFolder(), INDEX_AND_RANK_DATA_INI);
  661. Ini.Load(szFileName);
  662. Ini.GetInteger("Index", "Count", 0, &nIniCount);
  663.     Ini.WriteInteger("Index", "Count", nIniCount + nCount);
  664. for(i = 0;i < nCount;i++)
  665.     {
  666. sprintf(szKey, "%d_ID", i + 1 + nIniCount);
  667. Ini.WriteInteger("Index", szKey, pIncome[i].usIndexId);
  668. sprintf(szKey, "%d_Appened", i + 1 + nIniCount);
  669. Ini.WriteInteger("Index", szKey, pIncome[i].bValueAppened);
  670. sprintf(szKey, "%d_SortFlag", i + 1 + nIniCount);
  671. Ini.WriteInteger("Index", szKey, pIncome[i].bSortFlag);
  672.     }
  673. Ini.Save(szFileName);
  674. }
  675. /****************************************************************************
  676. *功能:把新收到的排名资料存到临时文件
  677. *****************************************************************************/
  678. void KUiStrengthRank::StoreNewDataToTempFile(unsigned int uParam, KRankMessage *pInData)
  679. {
  680. KIniFile Ini;
  681. KRankMessage *pIncome;
  682. int  nCount, nIniCount, nID, i;
  683. char szSection[32], szKey[32], szFileName[128];
  684. nCount = uParam & 0xffff;
  685. nID    = uParam >> 16;
  686. pIncome= pInData;
  687. sprintf(szFileName, "%s\%s", g_UiBase.GetUserTempDataFolder(), INDEX_AND_RANK_DATA_INI);
  688. Ini.Load(szFileName);
  689.     sprintf(szSection, "%d", nID);
  690.     Ini.GetInteger(szSection, "Count", 0, &nIniCount);
  691.     Ini.WriteInteger(szSection, "Count", nIniCount + nCount);
  692.     for(i = 0;i < nCount;i++)
  693.     {
  694. sprintf(szKey, "%d", i + 1 + nIniCount);
  695.     Ini.WriteStruct(szSection, szKey, pIncome + i, sizeof(KRankMessage));
  696.     }
  697. Ini.Save(szFileName);
  698. }
  699. /****************************************************************************
  700. *功能:检测临时文件是否存在,不存在则创建
  701. *****************************************************************************/
  702. int KUiStrengthRank::AttachTempFile()
  703. {
  704. FILE *fp;
  705. char szPath[128], szFile[128];
  706. sprintf(szFile, "%s\%s", g_UiBase.GetUserTempDataFolder(), INDEX_AND_RANK_DATA_INI);
  707. g_GetFullPath(szPath, szFile);
  708.     if(!(fp = fopen(szPath, "r")))
  709. {
  710. fp = fopen(szPath, "w");
  711. fclose(fp);
  712. if(!(fp = fopen(szPath, "r")))
  713. return 0;
  714. else
  715. fclose(fp);
  716. }
  717. else
  718. {
  719. fclose(fp);
  720. }
  721. return 1;
  722. }
  723. /****************************************************************************
  724. *功能:清空临时文件
  725. *****************************************************************************/
  726. void KUiStrengthRank::RemoveTempFile()
  727. {
  728. char szPath[128], szFile[128];
  729. sprintf(szFile, "%s\%s", g_UiBase.GetUserTempDataFolder(), INDEX_AND_RANK_DATA_INI);
  730. g_GetFullPath(szPath, szFile);
  731. remove(szPath);
  732. }
  733. /****************************************************************************
  734. *功能:把字串左右扩展到指定长度,中间用Tab分开
  735. *****************************************************************************/
  736. int TDrawOutString(char *szBuf, int nBufLen, int nLineLen, int nFontsize)
  737. {
  738. int nTabPos, nOldLineLen;
  739. nTabPos = TFindSpecialCtrlInEncodedText(szBuf, nBufLen, 0, KTC_TAB);
  740. if(nTabPos > 0)
  741. {
  742. TGetEncodedTextLineCount(szBuf, nBufLen, 0, nOldLineLen, nFontsize);
  743. if(nOldLineLen < nLineLen)
  744. {
  745. memmove(szBuf + nTabPos + nLineLen - nOldLineLen + 1, szBuf + nTabPos + 1, nBufLen - nTabPos - 1);
  746. memset(szBuf + nTabPos, 0x20, nLineLen - nOldLineLen + 1);
  747. return nBufLen + nLineLen - nOldLineLen;
  748. }
  749. }
  750. return nBufLen;
  751. }