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

模拟服务器

开发平台:

C/C++

  1. /*****************************************************************************************
  2. // 界面--聊天主界面
  3. // Copyright : Kingsoft 2003
  4. // Author :   Wooy(Wu yue)
  5. // CreateTime: 2003-3-10
  6. *****************************************************************************************/
  7. #include "KWin32.h"
  8. #include "KIniFile.h"
  9. #include <crtdbg.h>
  10. #include "../Elem/WndMessage.h"
  11. #include "UiChatCentre.h"
  12. #include "../Elem/Wnds.h"
  13. #include "UiChatStatus.h"
  14. #include "../UiBase.h"
  15. #include "UiGetString.h"
  16. #include "UiSelPlayerNearby.h"
  17. #include "../UiSoundSetting.h"
  18. #include "../../../core/src/coreshell.h"
  19. #include "../../../Represent/iRepresent/iRepresentShell.h"
  20. #include "../../../Represent/iRepresent/KRepresentUnit.h"
  21. #include "../../../Engine/Src/Text.h"
  22. #include "../../../core/src/GameDataDef.h"
  23. #include "KProtocol.h"
  24. #include "KRelayProtocol.h"
  25. #include "KTongProtocol.h"
  26. #include "malloc.h"
  27. extern iRepresentShell* g_pRepresentShell;
  28. extern iCoreShell* g_pCoreShell;
  29. #define SCHEME_INI "聊天主窗口.ini"
  30. #define GROUP_MENU_SELECT_BASE 0x100
  31. #define FRIEND_MENU_SELECT_BASE 0x200
  32. #define SEL_GROUP_MENU_SELECT_BASE 0x300
  33. #define SEL_UNIT_MENU_SELECT_BASE 0x400
  34. enum GROUP_MENU_ITEM
  35. {
  36. GROUP_MENU_ITEM_NEW = 0,
  37. GROUP_MENU_ITEM_RENAME,
  38. GROUP_MENU_ITEM_DELETE,
  39. };
  40. enum FRIEND_MENU_ITEM
  41. {
  42. FRIEND_MENU_ITEM_SEND_MSG = 0,
  43. FRIEND_MENU_ITEM_DELETE,
  44. FRIEND_MENU_ITEM_MOVE,
  45. };
  46. enum INPUT_STRING_PARAM
  47. {
  48. ISP_NEW_GROUP = 0x100,
  49. ISP_RENAME_GROUP = 0x200,
  50. };
  51. #define DEF_GROUP_MENU_ITEM_COUNT 1
  52. const char* l_pGrupMenuItemTitle[GROUP_MENU_ITEM_COUNT] = 
  53. {
  54.  "新建组", "重命名组", "删除组"
  55. };
  56. const char* l_pFriendMenuItemTitle[FRIEND_MENU_ITEM_COUNT] = 
  57. {
  58. "发送消息", "删除", "移动到其它组"
  59. };
  60. #define FRIEND_INDEX 0
  61. #define FRIEND_UNITNAME "好友"
  62. #define BROTHER_INDEX 1
  63. #define BROTHER_UNITNAME "亲人"
  64. #define ENEMY_INDEX 2
  65. #define ENEMY_UNITNAME  "仇人"
  66. #define DEFAULT_GROUPNAME "我的"
  67. #define ONLINE_NAME "online"
  68. #define OFFLINE_NAME "offline"
  69. KUiChatCentre* KUiChatCentre::m_pSelf = NULL;
  70. ServerNotify KUiChatCentre::ms_SNotify;
  71. int ServerNotify::CreateUnit(const char* Unit)
  72. {
  73. AddinNotify::CreateUnit(Unit);
  74. SendSyncData(Unit);
  75. return 0;
  76. }
  77. int ServerNotify::RenameUnitGroup(const char* Unit, const char* Name, const char* NewName, const STRINGLIST& friends)
  78. {
  79. AddinNotify::RenameUnitGroup(Unit, Name, NewName, friends);
  80. if (NewName && NewName[0])
  81. SendNotifyGroupFriend(Unit, std::string(NewName), friends);
  82. return 0;
  83. }
  84. int ServerNotify::DeleteUnitGroup(const char* Unit, const char* Name, const STRINGLIST& friends)
  85. {
  86. AddinNotify::DeleteUnitGroup(Unit, Name, friends);
  87. if (Name && Name[0])
  88. SendNotifyGroupFriend(Unit, "", friends);
  89. return 0;
  90. }
  91. int ServerNotify::MoveUnitGroup(const char* Unit, const char* Name, const char* Name2, const STRINGLIST& friends)
  92. {
  93. AddinNotify::MoveUnitGroup(Unit, Name, Name2, friends);
  94. if (Name2 && Name2[0])
  95. SendNotifyGroupFriend(Unit, std::string(Name2), friends);
  96. return 0;
  97. }
  98. int ServerNotify::DeleteUnitMember(const char* Unit, const char* Name)
  99. {
  100. AddinNotify::DeleteUnitMember(Unit, Name);
  101. SendNotifyDeleteFriend(Unit, Name);
  102. return 0;
  103. }
  104. int ServerNotify::MoveUnitMember(const char* Unit, const char* Name, const char* Group)
  105. {
  106. AddinNotify::MoveUnitMember(Unit, Name, Group);
  107. if (Name && Name[0])
  108. {
  109. STRINGLIST friends;
  110. friends.push_back(Name);
  111. SendNotifyGroupFriend(Unit, Group, friends);
  112. }
  113. return 0;
  114. }
  115. void ServerNotify::SendSyncData(const char* Unit)
  116. {
  117. if (m_nRef <= 0)
  118. return;
  119. static int nSend = 0; //公用的初始化只能做1次
  120. if (g_pCoreShell && nSend == 0)
  121. {
  122. size_t asksize = sizeof(ASK_SYNCFRIENDLIST);
  123. size_t pckgsize = sizeof(tagExtendProtoHeader) + asksize;
  124. tagExtendProtoHeader* pExHeader = (tagExtendProtoHeader*)_alloca(pckgsize);
  125. pExHeader->ProtocolType = c2s_extendfriend;
  126. pExHeader->wLength = pckgsize - 1;
  127. ASK_SYNCFRIENDLIST* pCccCmd = (ASK_SYNCFRIENDLIST*)(pExHeader + 1);
  128. pCccCmd->ProtocolFamily = pf_friend;
  129. pCccCmd->ProtocolID = friend_c2s_asksyncfriendlist;
  130. pCccCmd->pckgid = -1;
  131. pCccCmd->full = true;
  132. g_pCoreShell->SendNewDataToServer(pExHeader, pckgsize);
  133. }
  134. nSend = (nSend + 1) % m_nRef;
  135. }
  136. void ServerNotify::SendNotifyGroupFriend(const char* Unit, const std::string& group, const STRINGLIST& friends)
  137. {
  138. if (m_nRef <= 0)
  139. return;
  140. if (Unit == NULL)
  141. return;
  142. if (friends.empty())
  143. return;
  144. std::string sendgname = Unit;
  145. sendgname += "n";
  146. sendgname += group;
  147. static const size_t max_packagesize = 1024 - 32 - sizeof(DWORD) * 2;
  148. char buffer[max_packagesize]; //max package size
  149. size_t basesize = sizeof(tagExtendProtoHeader) + sizeof(GROUP_FRIEND);
  150. tagExtendProtoHeader* pExHeader = (tagExtendProtoHeader*)buffer;
  151. pExHeader->ProtocolType = c2s_extendfriend;
  152. GROUP_FRIEND* pGf = (GROUP_FRIEND*)(pExHeader + 1);
  153. pGf->ProtocolFamily = pf_friend;
  154. pGf->ProtocolID = friend_c2s_groupfriend;
  155. buffer[basesize++] = specGroup;
  156. strcpy(buffer + basesize, sendgname.c_str());
  157. basesize += sendgname.size() + 1;
  158. size_t cursor = basesize;
  159. for (STRINGLIST::const_iterator itFriend = friends.begin(); itFriend != friends.end(); itFriend++)
  160. {
  161. std::string dst = *itFriend;
  162. size_t appendsize = 1 + dst.size() + 1;
  163. if (cursor + appendsize + 1 + 1 > max_packagesize)
  164. {
  165. buffer[cursor++] = specOver;
  166. pExHeader->wLength = cursor - 1;
  167. g_pCoreShell->SendNewDataToServer(buffer, cursor);
  168. cursor = basesize;
  169. }
  170. buffer[cursor] = specRole;
  171. strcpy(buffer + 1 + cursor, dst.c_str());
  172. cursor += appendsize;
  173. }
  174. if (cursor > basesize)
  175. {
  176. buffer[cursor++] = specOver;
  177. pExHeader->wLength = cursor - 1;
  178. g_pCoreShell->SendNewDataToServer(buffer, cursor);
  179. }
  180. }
  181. void ServerNotify::SendNotifyDeleteFriend(const char* Unit, const char* Name)
  182. {
  183. if (m_nRef <= 0)
  184. return;
  185. if (Name == NULL || Name[0] == 0)
  186. return;
  187. if (g_pCoreShell)
  188. {
  189. size_t asksize = sizeof(ERASE_FRIEND);
  190. size_t pckgsize = sizeof(tagExtendProtoHeader) + asksize;
  191. tagExtendProtoHeader* pExHeader = (tagExtendProtoHeader*)_alloca(pckgsize);
  192. pExHeader->ProtocolType = c2s_extendfriend;
  193. pExHeader->wLength = pckgsize - 1;
  194. ERASE_FRIEND* pCccCmd = (ERASE_FRIEND*)(pExHeader + 1);
  195. pCccCmd->ProtocolFamily = pf_friend;
  196. pCccCmd->ProtocolID = friend_c2s_erasefriend;
  197. strncpy(pCccCmd->friendrole, Name, _NAME_LEN);
  198. g_pCoreShell->SendNewDataToServer(pExHeader, pckgsize);
  199. }
  200. }
  201. ///////////////////////////////////////////////////////////////////////////////
  202. KUiChatCentre::KUiChatCentre()
  203. {
  204. m_nNumValidGroup = 0;
  205. m_nNumFriendInList = 0;
  206. m_pFriendList = NULL;
  207. memset(&m_bValidGroup, 0, sizeof(m_bValidGroup));
  208. m_uFriendOffLineColor = 0;
  209. m_bPopupMenu = false;
  210. m_pSelGrupMenu = NULL;
  211. int i;
  212. KPopupMenuData* pMenuData = (KPopupMenuData*)(&m_GroupMenuData);
  213. KPopupMenu::InitMenuData(pMenuData, GROUP_MENU_ITEM_COUNT);
  214. for (i = 0; i < GROUP_MENU_ITEM_COUNT; i++)
  215. {
  216. strcpy(pMenuData->Items[i].szData, l_pGrupMenuItemTitle[i]);
  217. pMenuData->Items[i].uDataLen = strlen(pMenuData->Items[i].szData);
  218. }
  219. pMenuData = (KPopupMenuData*)(&m_FriendMenuData);
  220. KPopupMenu::InitMenuData(pMenuData, FRIEND_MENU_ITEM_COUNT);
  221. for (i = 0; i < FRIEND_MENU_ITEM_COUNT; i++)
  222. {
  223. strcpy(pMenuData->Items[i].szData, l_pFriendMenuItemTitle[i]);
  224. pMenuData->Items[i].uDataLen = strlen(pMenuData->Items[i].szData);
  225. }
  226. m_nMaxVisibleLine = 0;
  227. m_nMinVisibleLine = 0;
  228. m_nNumVisibleLine = 0;
  229. m_nLineHeight = 8;
  230. m_nFirstVisibleLine = 0;
  231. memset(&m_ListBgImage, 0, sizeof(m_ListBgImage));
  232. m_ListBgImgLeft = 0;
  233. m_ListBgImgTop = 0;
  234. m_nTailImgDragOffsetY = 0;
  235. m_nCurentFriendUnit = FRIEND_INDEX;
  236. ms_SNotify.m_nRef = 0;
  237. //初始化好友
  238. m_AllFriendUnits[FRIEND_INDEX].m_UnitName = FRIEND_UNITNAME;
  239. ClearUnitData(FRIEND_INDEX);
  240. m_AllFriendUnits[FRIEND_INDEX].m_pNotify = &ms_SNotify;
  241. ms_SNotify.m_nRef++;
  242. //初始化亲友
  243. m_AllFriendUnits[BROTHER_INDEX].m_UnitName = BROTHER_UNITNAME;
  244. ClearUnitData(BROTHER_INDEX);
  245. m_AllFriendUnits[BROTHER_INDEX].m_pNotify = &ms_SNotify;
  246. ms_SNotify.m_nRef++;
  247. //初始化仇人
  248. m_AllFriendUnits[ENEMY_INDEX].m_UnitName = ENEMY_UNITNAME;
  249. ClearUnitData(ENEMY_INDEX);
  250. m_AllFriendUnits[ENEMY_INDEX].m_pNotify = &ms_SNotify;
  251. ms_SNotify.m_nRef++;
  252. m_nFriendUnitCount = 3;
  253. }
  254. //--------------------------------------------------------------------------
  255. // 功能:如果窗口正被显示,则返回实例指针
  256. //--------------------------------------------------------------------------
  257. KUiChatCentre* KUiChatCentre::GetIfVisible()
  258. {
  259. if (m_pSelf && m_pSelf->IsVisible())
  260. return m_pSelf;
  261. return NULL;
  262. }
  263. //--------------------------------------------------------------------------
  264. // 功能:打开窗口,返回唯一的一个类对象实例
  265. //--------------------------------------------------------------------------
  266. KUiChatCentre* KUiChatCentre::OpenWindow(bool bShow)
  267. {
  268. if (m_pSelf == NULL)
  269. {
  270. m_pSelf = new KUiChatCentre;
  271. if (m_pSelf)
  272. m_pSelf->Initialize();
  273. }
  274. if (m_pSelf && bShow)
  275. {
  276. UiSoundPlay(UI_SI_WND_OPENCLOSE);
  277. m_pSelf->UpdateAll(m_pSelf->m_AllFriendUnits[m_pSelf->m_nCurentFriendUnit].m_nCurExpandGroup);
  278. m_pSelf->UpdateInterface();
  279. m_pSelf->BringToTop();
  280. m_pSelf->Show();
  281. }
  282. return m_pSelf;
  283. }
  284. //--------------------------------------------------------------------------
  285. // 功能:初始化
  286. //--------------------------------------------------------------------------
  287. void KUiChatCentre::Initialize()
  288. {
  289. AddChild(&m_ScrollUpBtn);
  290. AddChild(&m_TailImg);
  291. AddChild(&m_FindBtn);
  292. AddChild(&m_CloseBtn);
  293. AddChild(&m_ScrollDownBtn);
  294. AddChild(&m_UnitBtnFriend);
  295. AddChild(&m_UnitBtnBrother);
  296. AddChild(&m_UnitBtnEnemy);
  297. AddChild(&m_UnitBtnOther);
  298. for (int i = 0; i < MAX_GROUP_NUM; i++)
  299. AddChild(&m_GroupBtn[i]);
  300. AddChild(&m_FriendList);
  301. char Scheme[128];
  302. g_UiBase.GetCurSchemePath(Scheme, 256);
  303. LoadScheme(Scheme);
  304. m_Style &= ~WND_S_VISIBLE;
  305. Wnd_AddWindow(this);
  306. }
  307. //--------------------------------------------------------------------------
  308. // 功能:关闭窗口,同时可以选则是否删除对象实例
  309. //--------------------------------------------------------------------------
  310. void KUiChatCentre::CloseWindow(bool bDestroy)
  311. {
  312. if (m_pSelf)
  313. {
  314. m_pSelf->CancelMenu();
  315. if (bDestroy == false)
  316. {
  317. m_pSelf->Hide();
  318. }
  319. else
  320. {
  321. m_pSelf->Destroy();
  322. m_pSelf = NULL;
  323. }
  324. }
  325. }
  326. //--------------------------------------------------------------------------
  327. // 功能:载入窗口的界面方案
  328. //--------------------------------------------------------------------------
  329. void KUiChatCentre::LoadScheme(const char* pScheme)
  330. {
  331. if (m_pSelf)
  332. {
  333. char Buff[128];
  334. KIniFile Ini;
  335. sprintf(Buff, "%s\"SCHEME_INI, pScheme);
  336. if (Ini.Load(Buff))
  337. m_pSelf->LoadScheme(&Ini);
  338. }
  339. }
  340. void KUiChatCentre::LoadScheme(class KIniFile* pIni)
  341. {
  342. int i;
  343. char Buff[32];
  344. _ASSERT(pIni);
  345. int nVisibleLine = m_nNumVisibleLine;
  346. m_nMinVisibleLine = 0;
  347. AdjustSize(0);
  348. KWndShowAnimate::Init(pIni, "Main");
  349. m_TailImg.Init(pIni, "TailImg");
  350. m_FindBtn.Init(pIni, "FindBtn");
  351. m_CloseBtn.Init(pIni, "CloseBtn");
  352. m_ScrollUpBtn.Init(pIni, "ScrollUp");
  353. m_ScrollDownBtn.Init(pIni, "ScrollDown");
  354. m_UnitBtnFriend.Init(pIni, "UnitBtnFriend");
  355. m_UnitBtnFriend.SetText(FRIEND_UNITNAME);
  356. m_UnitBtnBrother.Init(pIni, "UnitBtnBrother");
  357. m_UnitBtnBrother.SetText(BROTHER_UNITNAME);
  358. m_UnitBtnEnemy.Init(pIni, "UnitBtnEnemy");
  359. m_UnitBtnEnemy.SetText(ENEMY_UNITNAME);
  360. m_UnitBtnOther.Init(pIni, "UnitBtnOther");
  361. m_UnitBtnOther.SetText("其它");
  362. m_FriendList.Init(pIni, "MemberList");
  363. if (pIni->GetString("MemberList", "OfflineColor", "0,0,0", Buff, sizeof(Buff)))
  364. m_uFriendOffLineColor = GetColor(Buff);
  365. else
  366. m_uFriendOffLineColor = 0;
  367. pIni->GetInteger2("MemberList", "NumLine",
  368. &m_nMinVisibleLine, &m_nMaxVisibleLine);
  369. if (nVisibleLine < m_nMinVisibleLine)
  370. pIni->GetInteger("MemberList", "InitLine", m_nMinVisibleLine, &nVisibleLine);
  371. if (m_nMinVisibleLine < 2)
  372. m_nMinVisibleLine = 2;
  373. if (m_nMaxVisibleLine < m_nMinVisibleLine)
  374. m_nMaxVisibleLine = m_nMinVisibleLine;
  375. m_GroupBtn[0].Init(pIni, "GroupBtn");
  376. for (i = 1; i < MAX_GROUP_NUM; i++)
  377. m_GroupBtn[0].Clone(&m_GroupBtn[i]);
  378. m_GroupBtn[0].GetPosition(&m_nFirstGroupBtnLeft, &m_nFirstGroupBtnTop);
  379. m_FriendList.SetCustomColorOffset((int)&(((KUiPlayerItem*)0)->nData));
  380. //好友列表背景图
  381. const char* SectionTitle = "ListBgImg";
  382. int nValue;
  383. m_ListBgImage.nType = ISI_T_SPR;
  384. m_ListBgImage.bRenderStyle = IMAGE_RENDER_STYLE_ALPHA;
  385. m_ListBgImage.Color.Color_dw = 0;
  386. m_ListBgImage.Color.Color_b.a = 255;
  387. pIni->GetInteger(SectionTitle, "Left", 0, &m_ListBgImgLeft);
  388. pIni->GetInteger(SectionTitle, "Top", 0, &m_ListBgImgTop);
  389. pIni->GetInteger(SectionTitle, "Width", 0, &m_ListBgImgWidth);
  390. pIni->GetInteger(SectionTitle, "Height", 0, &m_ListBgImgHeight);
  391. m_nLineHeight = m_ListBgImgHeight;
  392. if (m_nLineHeight < 8)
  393. m_nLineHeight = 8;
  394. m_ListBgImage.uImage = 0;
  395. m_ListBgImage.nISPosition = IMAGE_IS_POSITION_INIT;
  396. pIni->GetString(SectionTitle, "Image", "" , m_ListBgImage.szImage,
  397. sizeof(m_ListBgImage.szImage));
  398. pIni->GetInteger(SectionTitle, "Frame", 0, &nValue);
  399. m_ListBgImage.nFrame = nValue;
  400. AdjustSize(nVisibleLine);
  401. }
  402. void KUiChatCentre::CreateSeverUnit()
  403. {
  404. if (m_pSelf)
  405. {
  406. m_pSelf->ClearInterface();
  407. for (int i = 0; i < m_pSelf->m_nFriendUnitCount; i++)
  408. {
  409. m_pSelf->ClearUnitData(i);
  410. if (m_pSelf->m_AllFriendUnits[i].m_pNotify &&
  411. m_pSelf->m_AllFriendUnits[i].m_pNotify == &ms_SNotify)
  412. {
  413. m_pSelf->m_AllFriendUnits[i].m_pNotify->CreateUnit(m_pSelf->m_AllFriendUnits[i].m_UnitName.c_str());
  414. }
  415. }
  416. }
  417. }
  418. BOOL KUiChatCentre::LoadPrivateSetting(KIniFile* pFile)
  419. {
  420. if (m_pSelf)
  421. {
  422. char key[10];
  423. char GroupName[128];
  424. for (int j = 0; j < m_pSelf->m_nFriendUnitCount; j++)
  425. {
  426. for (int i = 1; i < MAX_GROUP_NUM; i++)
  427. {
  428. sprintf(key, "group%d", i);
  429. pFile->GetString(m_pSelf->m_AllFriendUnits[j].m_UnitName.c_str(), key, "", GroupName, 128);
  430. m_pSelf->m_AllFriendUnits[j].m_GroupInfo[i].strGroupName = GroupName;
  431. }
  432. }
  433. }
  434. return 1;
  435. }
  436. int KUiChatCentre::SavePrivateSetting(KIniFile* pFile)
  437. {
  438. if (m_pSelf)
  439. {
  440. char key[10];
  441. for (int j = 0; j < m_pSelf->m_nFriendUnitCount; j++)
  442. {
  443. for (int i = 1; i < MAX_GROUP_NUM; i++)
  444. {
  445. if (m_pSelf->m_AllFriendUnits[j].m_GroupInfo[i].strGroupName.empty())
  446. break;
  447. sprintf(key, "group%d", i);
  448. pFile->WriteString(m_pSelf->m_AllFriendUnits[j].m_UnitName.c_str(),
  449. key, m_pSelf->m_AllFriendUnits[j].m_GroupInfo[i].strGroupName.c_str());
  450. }
  451. }
  452. }
  453. return 1;
  454. }
  455. //--------------------------------------------------------------------------
  456. // 功能:窗口消息函数
  457. //--------------------------------------------------------------------------
  458. int KUiChatCentre::WndProc(unsigned int uMsg, unsigned int uParam, int nParam)
  459. {
  460. int nRet = 0;
  461. switch(uMsg)
  462. {
  463. case WND_N_BUTTON_CLICK:
  464. OnClickButton((KWndWindow*)uParam);
  465. break;
  466. case WND_N_BUTTON_HOLD:
  467. if (uParam == (unsigned int)(KWndWindow*)&m_ScrollUpBtn)
  468. OnScrollList(true);
  469. else if (uParam == (unsigned int)(KWndWindow*)&m_ScrollDownBtn)
  470. OnScrollList(false);
  471. break;
  472. case WND_M_POPUPMENU:
  473. OnClickGroupBtn((KWndWindow*)uParam, false);
  474. break;
  475. case WND_N_LIST_ITEM_D_CLICK:
  476. SendFriendMsg(nParam, true);
  477. break;
  478. //case WND_N_LIST_ITEM_SEL:
  479. // SendFriendMsg(nParam, false);
  480. // break;
  481. case WND_N_LIST_ITEM_R_CLICK:
  482. PopupFriendMenu(nParam);
  483. break;
  484. case WND_M_MENUITEM_SELECTED:
  485. if (uParam == (unsigned int)(KWndWindow*)this)
  486. {
  487. m_bPopupMenu = false;
  488. if (HIWORD(nParam) >= SEL_UNIT_MENU_SELECT_BASE && (short)(LOWORD(nParam)) >= 0)
  489. {
  490. OnSelUnit(LOWORD(nParam));
  491. }
  492. else if (HIWORD(nParam) >= SEL_GROUP_MENU_SELECT_BASE && (short)(LOWORD(nParam)) >= 0)
  493. {
  494. OnMoveFriendToGroup(HIWORD(nParam) - SEL_GROUP_MENU_SELECT_BASE, LOWORD(nParam));
  495. CancelMenu();
  496. }
  497. else if (HIWORD(nParam) >= FRIEND_MENU_SELECT_BASE)
  498. OnSelFriendMenu(HIWORD(nParam) - FRIEND_MENU_SELECT_BASE, LOWORD(nParam));
  499. else
  500. OnSelGroupMenu(HIWORD(nParam) - GROUP_MENU_SELECT_BASE, LOWORD(nParam));
  501. }
  502. break;
  503. case WND_M_OTHER_WORK_RESULT:
  504. if (nParam)
  505. {
  506. if (uParam == ISP_NEW_GROUP)
  507. {
  508. NewGroup(m_nCurentFriendUnit, (const char*)nParam);
  509. }
  510. else
  511. {
  512. int nGroupIndex = uParam - ISP_RENAME_GROUP;
  513. if (nGroupIndex >= 0 && nGroupIndex < MAX_GROUP_NUM)
  514. {
  515. ReplaceGroupName(m_nCurentFriendUnit, m_AllFriendUnits[m_nCurentFriendUnit].m_GroupInfo[nGroupIndex].strGroupName.c_str(), (const char*)nParam);
  516. }
  517. }
  518. }
  519. break;
  520. case WND_N_CHILD_MOVE:
  521. if (uParam == (unsigned int)(KWndWindow*)&m_TailImg)
  522. DragWndSize(nParam);
  523. break;
  524. default:
  525. nRet = KWndShowAnimate::WndProc(uMsg, uParam, nParam);
  526. break;
  527. }
  528. return nRet;
  529. }
  530. void KUiChatCentre::OnMoveFriendToGroup(int nFriendIndex, int nIndexInMenu)
  531. {
  532. if (nFriendIndex >= 0 && nFriendIndex < m_nNumFriendInList)
  533. {
  534. for (int nNewGroupIndex = 0;
  535. nIndexInMenu >= 0 && nNewGroupIndex < MAX_GROUP_NUM;
  536. nNewGroupIndex++)
  537. {
  538. if (m_bValidGroup[nNewGroupIndex] && nNewGroupIndex != m_AllFriendUnits[m_nCurentFriendUnit].m_nCurExpandGroup)
  539. {
  540. if ((nIndexInMenu--) == 0)
  541. {
  542. MoveFriendToGroup(m_nCurentFriendUnit, m_pFriendList[nFriendIndex].Name, m_AllFriendUnits[m_nCurentFriendUnit].m_GroupInfo[nNewGroupIndex].strGroupName.c_str());
  543. }
  544. }
  545. }
  546. }
  547. }
  548. void KUiChatCentre::OnSelGroupMenu(int nGroupIndex, int nCmd)
  549. {
  550. if (nGroupIndex < 0 || nGroupIndex >= MAX_GROUP_NUM ||
  551. m_bValidGroup[nGroupIndex] == false)
  552. return;
  553. switch(nCmd)
  554. {
  555. case GROUP_MENU_ITEM_RENAME:
  556. {
  557. char Name[32] = "";
  558. m_GroupBtn[nGroupIndex].GetLabel(Name, sizeof(Name));
  559. KUiGetString::OpenWindow("输入新的组名称", Name,
  560. (KWndWindow*)this, ISP_RENAME_GROUP + nGroupIndex);
  561. }
  562. break;
  563. case GROUP_MENU_ITEM_DELETE:
  564. {
  565. MoveGroupToGroup(m_nCurentFriendUnit, m_AllFriendUnits[m_nCurentFriendUnit].m_GroupInfo[nGroupIndex].strGroupName.c_str(), "", true);
  566. }
  567. break;
  568. case GROUP_MENU_ITEM_NEW:
  569. KUiGetString::OpenWindow("输入新组的名称", "",
  570. (KWndWindow*)this, ISP_NEW_GROUP);
  571. break;
  572. }
  573. }
  574. void KUiChatCentre::DragWndSize(int nMoveOffset)
  575. {
  576. if (nMoveOffset == 0)
  577. {
  578. m_nTailImgDragOffsetY = 0;
  579. }
  580. else
  581. {
  582. int nMoveOffsetX = (short)(nMoveOffset & 0xffff);
  583. int nMoveOffsetY = (short)((nMoveOffset >> 16) & 0xffff);
  584. int x, y;
  585. m_TailImg.GetPosition(&x, &y);
  586. x -= nMoveOffsetX;
  587. y -= nMoveOffsetY;
  588. m_TailImg.SetPosition(x, y);
  589. m_nTailImgDragOffsetY += nMoveOffsetY;
  590. int nLine;
  591. if (m_nTailImgDragOffsetY > 0)
  592. nLine = (m_nTailImgDragOffsetY + m_nLineHeight / 2) / m_nLineHeight;
  593. else
  594. nLine = (m_nTailImgDragOffsetY - m_nLineHeight / 2) / m_nLineHeight;
  595. nLine += m_nNumVisibleLine;
  596. if (nLine < m_nMinVisibleLine)
  597. nLine = m_nMinVisibleLine;
  598. else if (nLine > m_nMaxVisibleLine)
  599. nLine = m_nMaxVisibleLine;
  600. if (nLine != m_nNumVisibleLine)
  601. {
  602. m_nTailImgDragOffsetY -= (nLine - m_nNumVisibleLine) * m_nLineHeight;
  603. AdjustSize(nLine);
  604. }
  605. }
  606. }
  607. void KUiChatCentre::OnSelFriendMenu(int nFriendIndex, int nCmd)
  608. {
  609. if (nFriendIndex < 0 || nFriendIndex >= m_nNumFriendInList)
  610. return;
  611. KUiPlayerItem Friend;
  612. Friend = m_pFriendList[nFriendIndex];
  613. Friend.nData = 0;
  614. int nParam = 0;
  615. switch(nCmd)
  616. {
  617. case FRIEND_MENU_ITEM_SEND_MSG:
  618. SendFriendMsg(nFriendIndex, true);
  619. break;
  620. case FRIEND_MENU_ITEM_DELETE:
  621. DeleteFriend(m_nCurentFriendUnit, Friend.Name, true);
  622. break;
  623. case FRIEND_MENU_ITEM_MOVE:
  624. PopupSelGroupMenu(nFriendIndex);
  625. break;
  626. }
  627. }
  628. bool KUiChatCentre::OnClickGroupBtn(KWndWindow* pBtn, bool bLeftClick)
  629. {
  630. int nIndex = -1;
  631. for (int i = 0; i < MAX_GROUP_NUM; i++)
  632. {
  633. if (pBtn == (KWndWindow*)(&m_GroupBtn[i]))
  634. {
  635. nIndex = i;
  636. break;
  637. }
  638. }
  639. if (nIndex < 0)
  640. return false;
  641. if (bLeftClick)
  642. {
  643. if (nIndex != m_AllFriendUnits[m_nCurentFriendUnit].m_nCurExpandGroup)
  644. {
  645. UpdateGroup(nIndex);
  646. UpdateInterface();
  647. }
  648. }
  649. else
  650. PopupupGroupMenu(nIndex);
  651. return true;
  652. }
  653. #include "UiPlayerBar.h"
  654. #include "UiMsgCentrePad.h"
  655. void KUiChatCentre::SendFriendMsg(int nFriendIndex, bool bDBClick)
  656. {
  657. if (m_pFriendList && nFriendIndex >= 0 && nFriendIndex < m_nNumFriendInList)
  658. {
  659. KUiPlayerBar::InputNameMsg(false, m_pFriendList[nFriendIndex].Name, bDBClick);
  660. }
  661. }
  662. void KUiChatCentre::UpdateData(UICHATCENTRE_UPDATE eFlag, unsigned int uParam, int nGroupIndex)
  663. {
  664. if (m_pSelf)
  665. {
  666. switch(eFlag)
  667. {
  668. case UICC_U_ALL:
  669. m_pSelf->UpdateAll(m_pSelf->m_AllFriendUnits[m_pSelf->m_nCurentFriendUnit].m_nCurExpandGroup);
  670. break;
  671. case UICC_U_GROUP:
  672. if (nGroupIndex == m_pSelf->m_AllFriendUnits[m_pSelf->m_nCurentFriendUnit].m_nCurExpandGroup)
  673. m_pSelf->UpdateGroup(nGroupIndex);
  674. break;
  675. case UICC_U_FRIEND:
  676. m_pSelf->UpdateFriend((KUiPlayerItem*)uParam, nGroupIndex);
  677. break;
  678. }
  679. m_pSelf->UpdateInterface();
  680. }
  681. }
  682. bool KUiChatCentre::IsMyFriend(char* Name)
  683. {
  684. if (Name == NULL || Name[0] == 0)
  685. return false;
  686. if (m_pSelf)
  687. {
  688. for (int i = 0; i < m_pSelf->m_nFriendUnitCount; i++)
  689. {
  690. FRIENDINFOLIST::iterator iF = m_pSelf->m_AllFriendUnits[i].m_FriendMap.find(Name);
  691. if (iF != m_pSelf->m_AllFriendUnits[i].m_FriendMap.end())
  692. return true;
  693. i++;
  694. }
  695. }
  696. return false;
  697. }
  698. bool KUiChatCentre::AddFriendInfo(int nUnitIndex, char* Name, char* group)
  699. {
  700. if (Name == NULL || Name[0] == 0 || group == NULL)
  701. return false;
  702. if (m_pSelf)
  703. {
  704. if (nUnitIndex < 0 || nUnitIndex >= m_pSelf->m_nFriendUnitCount)
  705. return false;
  706. if (m_pSelf->m_AllFriendUnits[nUnitIndex].m_FriendMap.find(Name) != m_pSelf->m_AllFriendUnits[nUnitIndex].m_FriendMap.end())
  707. { //已存在于列表中
  708. NewGroup(nUnitIndex, group);
  709. MoveFriendToGroup(nUnitIndex, Name, group);
  710. return true;
  711. }
  712. std::string strGroup;
  713. strGroup = group;
  714. int nCount = 0;
  715. int i = 0;
  716. if (m_pSelf->m_AllFriendUnits[nUnitIndex].m_GroupInfo[i].strGroupName == strGroup)
  717. {
  718. nCount = m_pSelf->m_AllFriendUnits[nUnitIndex].m_GroupInfo[i].nGroupMemberNum + 1;
  719. }
  720. else
  721. {
  722. for (i = 1; i < MAX_GROUP_NUM; i++)
  723. {
  724. if (m_pSelf->m_AllFriendUnits[nUnitIndex].m_GroupInfo[i].strGroupName.empty())
  725. break;
  726. if (m_pSelf->m_AllFriendUnits[nUnitIndex].m_GroupInfo[i].strGroupName == strGroup)
  727. {
  728. nCount = m_pSelf->m_AllFriendUnits[nUnitIndex].m_GroupInfo[i].nGroupMemberNum + 1;
  729. break;
  730. }
  731. }
  732. }
  733. if (i < MAX_GROUP_NUM)
  734. {
  735. if (nCount > 0) //已有的组
  736. m_pSelf->m_AllFriendUnits[nUnitIndex].m_GroupInfo[i].nGroupMemberNum = nCount;
  737. else //没有的组,而且有空组的位置
  738. {
  739. m_pSelf->m_AllFriendUnits[nUnitIndex].m_GroupInfo[i].strGroupName = strGroup;
  740. m_pSelf->m_AllFriendUnits[nUnitIndex].m_GroupInfo[i].nGroupMemberNum = 1;
  741. }
  742. }
  743. else //新组没有空位,归到默认组
  744. {
  745. strGroup = m_pSelf->m_AllFriendUnits[nUnitIndex].m_GroupInfo[0].strGroupName;
  746. m_pSelf->m_AllFriendUnits[nUnitIndex].m_GroupInfo[0].nGroupMemberNum++;
  747. }
  748. m_pSelf->m_AllFriendUnits[nUnitIndex].m_FriendMap[Name] = strGroup;
  749. if (m_pSelf->m_AllFriendUnits[nUnitIndex].m_pNotify)
  750. m_pSelf->m_AllFriendUnits[nUnitIndex].m_pNotify->CreateUnitMember(
  751. m_pSelf->m_AllFriendUnits[nUnitIndex].m_UnitName.c_str(), Name, group);
  752. if (m_pSelf->m_AllFriendUnits[nUnitIndex].m_UnitName == m_pSelf->m_AllFriendUnits[m_pSelf->m_nCurentFriendUnit].m_UnitName)
  753. {
  754. m_pSelf->UpdateAll(m_pSelf->m_AllFriendUnits[m_pSelf->m_nCurentFriendUnit].m_nCurExpandGroup);
  755. m_pSelf->UpdateInterface();
  756. }
  757. return true;
  758. }
  759. return false;
  760. }
  761. bool KUiChatCentre::FriendStatus(int nUnitIndex, char* Name, BYTE state)
  762. {
  763. if (m_pSelf)
  764. {
  765. if (nUnitIndex < 0 || nUnitIndex >= m_pSelf->m_nFriendUnitCount)
  766. return false;
  767. if (Name && Name[0] != 0)
  768. {
  769. m_pSelf->m_AllFriendUnits[nUnitIndex].m_FriendOnlineMap[Name] = state;
  770. if (m_pSelf->m_AllFriendUnits[nUnitIndex].m_pNotify)
  771. m_pSelf->m_AllFriendUnits[nUnitIndex].m_pNotify->SetUnitMemberStatus(
  772. m_pSelf->m_AllFriendUnits[nUnitIndex].m_UnitName.c_str(), Name,
  773. state == stateOnline ? ONLINE_NAME : OFFLINE_NAME);
  774. if (m_pSelf->m_nCurentFriendUnit == nUnitIndex)
  775. {
  776. FRIENDINFOLIST::iterator i = m_pSelf->m_AllFriendUnits[nUnitIndex].m_FriendMap.find(Name);
  777. if (i != m_pSelf->m_AllFriendUnits[nUnitIndex].m_FriendMap.end())
  778. {
  779. int nNewGroupIndex = m_pSelf->m_AllFriendUnits[nUnitIndex].FindGroupIndex(i->second);
  780. if (nNewGroupIndex == m_pSelf->m_AllFriendUnits[m_pSelf->m_nCurentFriendUnit].m_nCurExpandGroup)
  781. {
  782. m_pSelf->UpdateGroup(nNewGroupIndex);
  783. m_pSelf->UpdateInterface();
  784. }
  785. }
  786. }
  787. if (state == stateOnline)
  788. UiSoundPlay(UI_SI_FRIEND_ONLINE);
  789. return true;
  790. }
  791. }
  792. return false;
  793. }
  794. void KUiChatCentre::NewGroup(int nUnitIndex, const char* szGroup)
  795. {
  796. if (m_pSelf)
  797. {
  798. if (nUnitIndex < 0 || nUnitIndex >= m_pSelf->m_nFriendUnitCount)
  799. return;
  800. std::string strGroup;
  801. strGroup = szGroup;
  802. if (m_pSelf->m_AllFriendUnits[nUnitIndex].m_GroupInfo[0].strGroupName == strGroup)
  803. {
  804. return;
  805. }
  806. for (int i = 1; i < MAX_GROUP_NUM; i++)
  807. {
  808. if (m_pSelf->m_AllFriendUnits[nUnitIndex].m_GroupInfo[i].strGroupName == strGroup)
  809. {
  810. break;
  811. }
  812. else if (m_pSelf->m_AllFriendUnits[nUnitIndex].m_GroupInfo[i].strGroupName.empty())
  813. {
  814. m_pSelf->m_AllFriendUnits[nUnitIndex].m_GroupInfo[i].strGroupName = strGroup;
  815. if (m_pSelf->m_AllFriendUnits[nUnitIndex].m_pNotify)
  816. m_pSelf->m_AllFriendUnits[nUnitIndex].m_pNotify->CreateUnitGroup(m_pSelf->m_AllFriendUnits[nUnitIndex].m_UnitName.c_str(), strGroup.c_str());
  817. if (nUnitIndex == m_pSelf->m_nCurentFriendUnit)
  818. {
  819. m_pSelf->UpdateAll(m_pSelf->m_AllFriendUnits[nUnitIndex].m_nCurExpandGroup);
  820. m_pSelf->UpdateInterface();
  821. }
  822. break;
  823. }
  824. }
  825. }
  826. }
  827. void KUiChatCentre::ReplaceGroupName(int nUnitIndex, const char* sz, const char* szGroup)
  828. {
  829. if (m_pSelf)
  830. {
  831. if (nUnitIndex < 0 || nUnitIndex >= m_pSelf->m_nFriendUnitCount)
  832. return;
  833. std::string str;
  834. if (sz)
  835. str = sz;
  836. std::string strGroup;
  837. if (szGroup)
  838. strGroup = szGroup;
  839. if (str == strGroup)
  840. return;
  841. if (m_pSelf->m_AllFriendUnits[nUnitIndex].FindGroupIndex(strGroup) >= 0)
  842. return;
  843. int i = m_pSelf->m_AllFriendUnits[nUnitIndex].FindGroupIndex(str);
  844. if (i <= 0) //0是不能改名的
  845. return;
  846. STRINGLIST list;
  847. FRIENDINFOLIST::iterator iF = m_pSelf->m_AllFriendUnits[nUnitIndex].m_FriendMap.begin();
  848. for (; iF != m_pSelf->m_AllFriendUnits[nUnitIndex].m_FriendMap.end(); iF++)
  849. {
  850. if (iF->second == str)
  851. {
  852. iF->second = strGroup;
  853. list.push_back(iF->first);
  854. }
  855. }
  856. std::string strOld = m_pSelf->m_AllFriendUnits[nUnitIndex].m_GroupInfo[i].strGroupName;
  857. m_pSelf->m_AllFriendUnits[nUnitIndex].m_GroupInfo[i].strGroupName = strGroup;
  858. if (m_pSelf->m_AllFriendUnits[nUnitIndex].m_pNotify)
  859. m_pSelf->m_AllFriendUnits[nUnitIndex].m_pNotify->RenameUnitGroup(
  860. m_pSelf->m_AllFriendUnits[nUnitIndex].m_UnitName.c_str(), strOld.c_str(), strGroup.c_str(), list);
  861. if (nUnitIndex == m_pSelf->m_nCurentFriendUnit)
  862. {
  863. m_pSelf->UpdateAll(m_pSelf->m_AllFriendUnits[nUnitIndex].m_nCurExpandGroup);
  864. m_pSelf->UpdateInterface();
  865. }
  866. }
  867. }
  868. void KUiChatCentre::MoveFriendToGroup(int nUnitIndex, const char* Name, const char* group)
  869. {
  870. if (m_pSelf)
  871. {
  872. if (nUnitIndex < 0 || nUnitIndex >= m_pSelf->m_nFriendUnitCount)
  873. return;
  874. int nNewGroupIndex = m_pSelf->m_AllFriendUnits[nUnitIndex].FindGroupIndex(group);
  875. if (nNewGroupIndex < 0)
  876. return;
  877. FRIENDINFOLIST::iterator iF = m_pSelf->m_AllFriendUnits[nUnitIndex].m_FriendMap.find(Name);
  878. if (iF != m_pSelf->m_AllFriendUnits[nUnitIndex].m_FriendMap.end())
  879. {
  880. int nSrcIndex = m_pSelf->m_AllFriendUnits[nUnitIndex].FindGroupIndex(iF->second);
  881. if (nSrcIndex >= 0)
  882. m_pSelf->m_AllFriendUnits[nUnitIndex].m_GroupInfo[nSrcIndex].nGroupMemberNum--;
  883. iF->second = group;
  884. m_pSelf->m_AllFriendUnits[nUnitIndex].m_GroupInfo[nNewGroupIndex].nGroupMemberNum++;
  885. if (m_pSelf->m_AllFriendUnits[nUnitIndex].m_pNotify)
  886. m_pSelf->m_AllFriendUnits[nUnitIndex].m_pNotify->MoveUnitMember(
  887. m_pSelf->m_AllFriendUnits[nUnitIndex].m_UnitName.c_str(), Name, group);
  888. if (nUnitIndex == m_pSelf->m_nCurentFriendUnit &&
  889. (nSrcIndex == m_pSelf->m_AllFriendUnits[nUnitIndex].m_nCurExpandGroup ||
  890.  nNewGroupIndex == m_pSelf->m_AllFriendUnits[nUnitIndex].m_nCurExpandGroup)
  891. )
  892. {
  893. m_pSelf->UpdateGroup(m_pSelf->m_AllFriendUnits[nUnitIndex].m_nCurExpandGroup);
  894. m_pSelf->UpdateInterface();
  895. }
  896. }
  897. }
  898. }
  899. void KUiChatCentre::MoveGroupToGroup(int nUnitIndex, const char* group, const char* group2, bool bDelgroup)
  900. {
  901. if (m_pSelf)
  902. {
  903. if (nUnitIndex < 0 || nUnitIndex >= m_pSelf->m_nFriendUnitCount)
  904. return;
  905. int nSrcIndex = m_pSelf->m_AllFriendUnits[nUnitIndex].FindGroupIndex(group);
  906. if (nSrcIndex < 0)
  907. return;
  908. int nNewGroupIndex = m_pSelf->m_AllFriendUnits[nUnitIndex].FindGroupIndex(group2);
  909. if (nNewGroupIndex < 0)
  910. return;
  911. if (nSrcIndex == nNewGroupIndex)
  912. return;
  913. STRINGLIST list;
  914. FRIENDINFOLIST::iterator iF = m_pSelf->m_AllFriendUnits[nUnitIndex].m_FriendMap.begin();
  915. while (iF != m_pSelf->m_AllFriendUnits[nUnitIndex].m_FriendMap.end())
  916. {
  917. if (iF->second == group)
  918. {
  919. m_pSelf->m_AllFriendUnits[nUnitIndex].m_GroupInfo[nSrcIndex].nGroupMemberNum--;
  920. iF->second = group2;
  921. m_pSelf->m_AllFriendUnits[nUnitIndex].m_GroupInfo[nNewGroupIndex].nGroupMemberNum++;
  922. list.push_back(iF->first);
  923. }
  924. iF++;
  925. }
  926. if (m_pSelf->m_AllFriendUnits[nUnitIndex].m_pNotify)
  927. {
  928. if (bDelgroup)
  929. {
  930. m_pSelf->m_AllFriendUnits[nUnitIndex].m_pNotify->DeleteUnitGroup(
  931. m_pSelf->m_AllFriendUnits[nUnitIndex].m_UnitName.c_str(), group, list);
  932. }
  933. else
  934. {
  935. m_pSelf->m_AllFriendUnits[nUnitIndex].m_pNotify->MoveUnitGroup(
  936. m_pSelf->m_AllFriendUnits[nUnitIndex].m_UnitName.c_str(), group, group2, list);
  937. }
  938. }
  939. if (bDelgroup)
  940. {
  941. if (nSrcIndex != 0) //0是每个Unit的默认组,不能删除
  942. {
  943. for (;nSrcIndex < MAX_GROUP_NUM - 1; nSrcIndex++)
  944. {
  945. m_pSelf->m_AllFriendUnits[nUnitIndex].m_GroupInfo[nSrcIndex] = m_pSelf->m_AllFriendUnits[nUnitIndex].m_GroupInfo[nSrcIndex + 1];
  946. }
  947. m_pSelf->m_AllFriendUnits[nUnitIndex].m_GroupInfo[nSrcIndex].strGroupName = "";
  948. m_pSelf->m_AllFriendUnits[nUnitIndex].m_GroupInfo[nSrcIndex].nGroupMemberNum = 0;
  949. }
  950. }
  951. if (nUnitIndex == m_pSelf->m_nCurentFriendUnit)
  952. {
  953. m_pSelf->UpdateAll(nNewGroupIndex);
  954. m_pSelf->UpdateInterface();
  955. }
  956. }
  957. }
  958. int KUiChatCentre::FindUnitIndex(const char* unit)
  959. {
  960. if (unit == NULL || unit[0] == 0)
  961. return -1;
  962. if (m_pSelf)
  963. {
  964. for (int i = 0; i < m_pSelf->m_nFriendUnitCount; i++)
  965. {
  966. if (m_pSelf->m_AllFriendUnits[i].m_UnitName == unit)
  967. return i;
  968. }
  969. }
  970. return -1;
  971. }
  972. int KUiChatCentre::FindUnitIndexByRoleNameAtServerUnit(char* roleName)
  973. {
  974. if (roleName == NULL || roleName[0] == 0)
  975. return -1;
  976. if (m_pSelf)
  977. {
  978. for (int i = 0; i < m_pSelf->m_nFriendUnitCount; i++)
  979. {
  980. if (m_pSelf->m_AllFriendUnits[i].m_pNotify == &ms_SNotify &&
  981. m_pSelf->m_AllFriendUnits[i].m_FriendMap.find(roleName) != m_pSelf->m_AllFriendUnits[i].m_FriendMap.end())
  982. {
  983. return i;
  984. }
  985. }
  986. }
  987. return -1;
  988. }
  989. int KUiChatCentre::FindAddinUnitIndex(const char* unit)
  990. {
  991. if (unit == NULL || unit[0] == 0)
  992. return -1;
  993. if (m_pSelf)
  994. {
  995. for (int i = 0; i < m_pSelf->m_nFriendUnitCount; i++)
  996. {
  997. if (m_pSelf->m_AllFriendUnits[i].m_UnitName == unit &&
  998. m_pSelf->m_AllFriendUnits[i].m_pNotify != &ms_SNotify)
  999. return i;
  1000. }
  1001. }
  1002. return -1;
  1003. }
  1004. int KUiChatCentre::AddAddinUnit(const char* unit, FriendNotify* pNotify)
  1005. {
  1006. if (unit == NULL || unit[0] == 0)
  1007. return -1;
  1008. int nUnit = FindUnitIndex(unit);
  1009. if (nUnit < 0)
  1010. {
  1011. if (m_pSelf && m_pSelf->m_nFriendUnitCount < MAX_UNIT_NUM)
  1012. {
  1013. m_pSelf->m_AllFriendUnits[m_pSelf->m_nFriendUnitCount].m_UnitName = unit;
  1014. m_pSelf->ClearUnitData(m_pSelf->m_nFriendUnitCount);
  1015. m_pSelf->m_AllFriendUnits[m_pSelf->m_nFriendUnitCount].m_pNotify = pNotify;
  1016. m_pSelf->m_nFriendUnitCount++;
  1017. if (pNotify)
  1018. pNotify->CreateUnit(unit);
  1019. return m_pSelf->m_nFriendUnitCount - 1;
  1020. }
  1021. }
  1022. return nUnit;
  1023. }
  1024. int KUiChatCentre::RemoveAddinUnit(const char* unit)
  1025. {
  1026. if (unit == NULL || unit[0] == 0)
  1027. return -1;
  1028. int nUnit = FindUnitIndex(unit);
  1029. if (nUnit >= 0)
  1030. {
  1031. if (m_pSelf && m_pSelf->m_AllFriendUnits[nUnit].m_pNotify != &ms_SNotify)
  1032. {
  1033. bool bU = (nUnit == m_pSelf->m_nCurentFriendUnit);
  1034. m_pSelf->m_nFriendUnitCount--;
  1035. for (; nUnit < m_pSelf->m_nFriendUnitCount; nUnit++)
  1036. {
  1037. m_pSelf->m_AllFriendUnits[nUnit] = m_pSelf->m_AllFriendUnits[nUnit + 1];
  1038. }
  1039. if (m_pSelf->m_AllFriendUnits[nUnit].m_pNotify)
  1040. m_pSelf->m_AllFriendUnits[nUnit].m_pNotify->DeleteUnit(unit);
  1041. if (bU)
  1042. {
  1043. m_pSelf->m_nCurentFriendUnit = FRIEND_INDEX;
  1044. m_pSelf->UpdateAll(m_pSelf->m_AllFriendUnits[m_pSelf->m_nCurentFriendUnit].m_nCurExpandGroup);
  1045. m_pSelf->UpdateInterface();
  1046. }
  1047. return m_pSelf->m_nFriendUnitCount;
  1048. }
  1049. }
  1050. return -1;
  1051. }
  1052. void KUiChatCentre::DeleteFriend(int nUnitIndex, char* Name, bool bNotify)
  1053. {
  1054. if (Name == NULL || Name[0] == 0)
  1055. return;
  1056. if (m_pSelf)
  1057. {
  1058. FRIENDINFOLIST::iterator iF = m_pSelf->m_AllFriendUnits[nUnitIndex].m_FriendMap.find(Name);
  1059. if (iF != m_pSelf->m_AllFriendUnits[nUnitIndex].m_FriendMap.end())
  1060. {
  1061. int nI = m_pSelf->m_AllFriendUnits[nUnitIndex].FindGroupIndex(iF->second);
  1062. if (nI >= 0)
  1063. {
  1064. m_pSelf->m_AllFriendUnits[nUnitIndex].m_GroupInfo[nI].nGroupMemberNum--;
  1065. }
  1066. m_pSelf->m_AllFriendUnits[nUnitIndex].m_FriendMap.erase(iF);
  1067. if (m_pSelf->m_AllFriendUnits[nUnitIndex].m_pNotify && bNotify)
  1068. m_pSelf->m_AllFriendUnits[nUnitIndex].m_pNotify->DeleteUnitMember(m_pSelf->m_AllFriendUnits[nUnitIndex].m_UnitName.c_str(), Name);
  1069. if (nUnitIndex == m_pSelf->m_nCurentFriendUnit &&
  1070. nI == m_pSelf->m_AllFriendUnits[nUnitIndex].m_nCurExpandGroup)
  1071. {
  1072. m_pSelf->UpdateGroup(m_pSelf->m_AllFriendUnits[nUnitIndex].m_nCurExpandGroup);
  1073. m_pSelf->UpdateInterface();
  1074. }
  1075. }
  1076. }
  1077. }
  1078. // -------------------------------------------------------------------------
  1079. // 功能 : 点击按钮后的处理
  1080. // -------------------------------------------------------------------------
  1081. void KUiChatCentre::OnClickButton(KWndWindow* pWnd)
  1082. {
  1083. if (pWnd == (KWndWindow*)&m_ScrollUpBtn)
  1084. OnScrollList(true);
  1085. else if (pWnd == (KWndWindow*)&m_ScrollDownBtn)
  1086. OnScrollList(false);
  1087. else if (pWnd == (KWndWindow*)&m_FindBtn)
  1088. KUiSelPlayerNearby::OpenWindow();
  1089. else if (pWnd == (KWndWindow*)&m_CloseBtn)
  1090. CloseWindow(false);
  1091. else if (pWnd == (KWndWindow*)&m_UnitBtnFriend)
  1092. {
  1093. OnSelUnit(FRIEND_INDEX);
  1094. }
  1095. else if (pWnd == (KWndWindow*)&m_UnitBtnBrother)
  1096. {
  1097. OnSelUnit(BROTHER_INDEX);
  1098. }
  1099. else if (pWnd == (KWndWindow*)&m_UnitBtnEnemy)
  1100. {
  1101. OnSelUnit(ENEMY_INDEX);
  1102. }
  1103. else if (pWnd == (KWndWindow*)&m_UnitBtnOther)
  1104. {
  1105. PopupSelUnitMenu();
  1106. }
  1107. else
  1108. OnClickGroupBtn(pWnd, true);
  1109. }
  1110. void KUiChatCentre::OnSelUnit(int nUnitIndex)
  1111. {
  1112. if (nUnitIndex >= 0 && nUnitIndex < m_nFriendUnitCount)
  1113. {
  1114. m_nCurentFriendUnit = nUnitIndex;
  1115. UpdateAll(m_AllFriendUnits[m_nCurentFriendUnit].m_nCurExpandGroup);
  1116. UpdateInterface();
  1117. }
  1118. }
  1119. void KUiChatCentre::OnScrollList(bool bUp)
  1120. {
  1121. if (bUp == false)
  1122. {
  1123. m_nFirstVisibleLine ++;
  1124. UpdateInterface();
  1125. }
  1126. else if(m_nFirstVisibleLine > 0)
  1127. {
  1128. m_nFirstVisibleLine--;
  1129. UpdateInterface();
  1130. }
  1131. }
  1132. void KUiChatCentre::CancelMenu()
  1133. {
  1134. if (m_bPopupMenu)
  1135. {
  1136. KPopupMenu::Cancel();
  1137. m_bPopupMenu = false;
  1138. }
  1139. if (m_pSelGrupMenu)
  1140. {
  1141. free(m_pSelGrupMenu);
  1142. m_pSelGrupMenu = NULL;
  1143. }
  1144. }
  1145. void KUiChatCentre::PopupupGroupMenu(int nGroupIndex)
  1146. {
  1147. int x, y;
  1148. Wnd_GetCursorPos(&x, &y);
  1149. KPopupMenuData* pMenuData = (KPopupMenuData*)&m_GroupMenuData;
  1150. pMenuData->nX = x;
  1151. pMenuData->nY = y;
  1152. pMenuData->nItemWidth = MENU_ITEM_DEFAULT_WIDTH;
  1153. pMenuData->nNumItem = nGroupIndex ? GROUP_MENU_ITEM_COUNT : DEF_GROUP_MENU_ITEM_COUNT;
  1154. KPopupMenu::Popup(pMenuData, (KWndWindow*)this,
  1155. GROUP_MENU_SELECT_BASE + nGroupIndex);
  1156. m_bPopupMenu = true;
  1157. }
  1158. void KUiChatCentre::PopupFriendMenu(int nFriendIndex)
  1159. {
  1160. int x, y;
  1161. Wnd_GetCursorPos(&x, &y);
  1162. KPopupMenuData* pMenuData = (KPopupMenuData*)&m_FriendMenuData;
  1163. pMenuData->nX = x;
  1164. pMenuData->nY = y;
  1165. pMenuData->nItemWidth = MENU_ITEM_DEFAULT_WIDTH;
  1166. pMenuData->nNumItem = FRIEND_MENU_ITEM_COUNT;
  1167. if (m_nNumValidGroup <= 1)
  1168. pMenuData->nNumItem --; //移动好友到其它组无效
  1169. KPopupMenu::Popup(pMenuData, (KWndWindow*)this,
  1170. FRIEND_MENU_SELECT_BASE + nFriendIndex);
  1171. m_bPopupMenu = true;
  1172. }
  1173. void KUiChatCentre::PopupSelGroupMenu(int nFriendIndex)
  1174. {
  1175. if (m_nNumValidGroup <= 1)
  1176. return;
  1177. m_pSelGrupMenu = (KPopupMenuData*)malloc(MENU_DATA_SIZE(m_nNumValidGroup - 1));
  1178. if (m_pSelGrupMenu == NULL)
  1179. return;
  1180. KPopupMenu::InitMenuData(m_pSelGrupMenu, m_nNumValidGroup - 1);
  1181. m_pSelGrupMenu->nNumItem = 0;
  1182. for (int i = 0; i < MAX_GROUP_NUM && m_pSelGrupMenu->nNumItem < m_nNumValidGroup - 1; i++)
  1183. {
  1184. if (m_bValidGroup[i] && i != m_AllFriendUnits[m_nCurentFriendUnit].m_nCurExpandGroup)
  1185. {
  1186. m_GroupBtn[i].GetLabel(m_pSelGrupMenu->Items[m_pSelGrupMenu->nNumItem].szData,
  1187. sizeof(m_pSelGrupMenu->Items[0].szData));
  1188. m_pSelGrupMenu->Items[m_pSelGrupMenu->nNumItem].uDataLen = strlen(m_pSelGrupMenu->Items[m_pSelGrupMenu->nNumItem].szData);
  1189. m_pSelGrupMenu->nNumItem ++;
  1190. }
  1191. }
  1192. KPopupMenu::Popup(m_pSelGrupMenu, this, SEL_GROUP_MENU_SELECT_BASE + nFriendIndex);
  1193. }
  1194. void KUiChatCentre::PopupSelUnitMenu()
  1195. {
  1196. struct KPopupMenuData* pSelUnitMenu = (KPopupMenuData*)malloc(MENU_DATA_SIZE(m_nFriendUnitCount));
  1197. if (pSelUnitMenu == NULL)
  1198. return;
  1199. KPopupMenu::InitMenuData(pSelUnitMenu, m_nFriendUnitCount);
  1200. pSelUnitMenu->nNumItem = 0;
  1201. pSelUnitMenu->usMenuFlag |= PM_F_AUTO_DEL_WHEN_HIDE;
  1202. for (int i = 0; i < m_nFriendUnitCount; i++)
  1203. {
  1204. strncpy(pSelUnitMenu->Items[i].szData, m_AllFriendUnits[i].m_UnitName.c_str(), 63);
  1205. pSelUnitMenu->Items[i].szData[sizeof(pSelUnitMenu->Items[i].szData) - 1] = 0;
  1206. pSelUnitMenu->Items[i].uDataLen = strlen(pSelUnitMenu->Items[i].szData);
  1207. pSelUnitMenu->nNumItem++;
  1208. }
  1209. KPopupMenu::Popup(pSelUnitMenu, this, SEL_UNIT_MENU_SELECT_BASE);
  1210. }
  1211. void KUiChatCentre::ClearInterface()
  1212. {
  1213. CancelMenu();
  1214. ClearFriendList();
  1215. m_AllFriendUnits[m_nCurentFriendUnit].m_nCurExpandGroup = 0;
  1216. m_nNumValidGroup = 0;
  1217. for (int nIndex = 0; nIndex < MAX_GROUP_NUM; nIndex++)
  1218. m_bValidGroup[nIndex] = false;
  1219. }
  1220. void KUiChatCentre::ClearFriendList()
  1221. {
  1222. m_FriendList.SetContent(NULL, 0, 0, 0);
  1223. m_nNumFriendInList = 0;
  1224. if (m_pFriendList)
  1225. {
  1226. free(m_pFriendList);
  1227. m_pFriendList = NULL;
  1228. }
  1229. }
  1230. void KUiChatCentre::ClearUnitData(int nUnit)
  1231. {
  1232. if (nUnit >= 0 && nUnit < MAX_UNIT_NUM)
  1233. {
  1234. //不清理名字和m_pNotify
  1235. m_AllFriendUnits[nUnit].m_FriendMap.clear();
  1236. m_AllFriendUnits[nUnit].m_FriendOnlineMap.clear();
  1237. for (int i = 0; i < MAX_GROUP_NUM; i++)
  1238. {
  1239. m_AllFriendUnits[nUnit].m_GroupInfo[i].strGroupName = "";
  1240. m_AllFriendUnits[nUnit].m_GroupInfo[i].nGroupMemberNum = 0;
  1241. }
  1242. m_AllFriendUnits[nUnit].m_nCurExpandGroup = 0;
  1243. }
  1244. }
  1245. void KUiChatCentre::UpdateAll(int nCurGroup)
  1246. {
  1247. ClearInterface();
  1248. int nIndex = 0;
  1249. m_bValidGroup[nIndex] = true;
  1250. std::string strName = DEFAULT_GROUPNAME;
  1251. strName += m_AllFriendUnits[m_nCurentFriendUnit].m_UnitName;
  1252. m_GroupBtn[nIndex].SetLabel(strName.c_str());
  1253. m_nNumValidGroup++;
  1254. for (nIndex = 1; nIndex < MAX_GROUP_NUM; nIndex++)
  1255. {
  1256. if (m_AllFriendUnits[m_nCurentFriendUnit].m_GroupInfo[nIndex].strGroupName.empty())
  1257. {
  1258. m_bValidGroup[nIndex] = false;
  1259. }
  1260. else
  1261. {
  1262. m_bValidGroup[nIndex] = true;
  1263. m_GroupBtn[nIndex].SetLabel(m_AllFriendUnits[m_nCurentFriendUnit].m_GroupInfo[nIndex].strGroupName.c_str());
  1264. m_nNumValidGroup++;
  1265. }
  1266. }
  1267. m_AllFriendUnits[m_nCurentFriendUnit].m_nCurExpandGroup = nCurGroup;
  1268. if (m_bValidGroup[m_AllFriendUnits[m_nCurentFriendUnit].m_nCurExpandGroup] == false)
  1269. {
  1270. m_AllFriendUnits[m_nCurentFriendUnit].m_nCurExpandGroup = 0;
  1271. for (nIndex = 0; nIndex < MAX_GROUP_NUM; nIndex++)
  1272. {
  1273. if (m_bValidGroup[nIndex])
  1274. {
  1275. m_AllFriendUnits[m_nCurentFriendUnit].m_nCurExpandGroup = nIndex;
  1276. break;
  1277. }
  1278. }
  1279. }
  1280. UpdateGroup(m_AllFriendUnits[m_nCurentFriendUnit].m_nCurExpandGroup);
  1281. }
  1282. void KUiChatCentre::UpdateGroup(int nGroupIndex)
  1283. {
  1284. ClearFriendList();
  1285. if (nGroupIndex < 0 || nGroupIndex >= m_nNumValidGroup)
  1286. return;
  1287. char groupname[64];
  1288. m_GroupBtn[nGroupIndex].GetLabel(groupname, 64);
  1289. if (nGroupIndex == 0)
  1290. {
  1291. groupname[0] = 0;
  1292. }
  1293. else if (nGroupIndex >= 1 && nGroupIndex < MAX_GROUP_NUM)
  1294. {
  1295. if (m_AllFriendUnits[m_nCurentFriendUnit].m_GroupInfo[nGroupIndex].strGroupName.empty())
  1296. return;
  1297. }
  1298. m_AllFriendUnits[m_nCurentFriendUnit].m_nCurExpandGroup = nGroupIndex;
  1299. KUiChatGroupInfo Group;
  1300. strncpy(Group.szTitle, groupname, 32);
  1301. Group.nNumFriend = m_AllFriendUnits[m_nCurentFriendUnit].m_GroupInfo[nGroupIndex].nGroupMemberNum;
  1302. if (Group.nNumFriend)
  1303. {
  1304. m_pFriendList = (KUiPlayerItem*)malloc(sizeof(KUiPlayerItem) * Group.nNumFriend);
  1305. if (m_pFriendList)
  1306. {
  1307. FRIENDINFOLIST onlineList;
  1308. FRIENDINFOLIST offlineList;
  1309. FRIENDINFOLIST::iterator i = m_AllFriendUnits[m_nCurentFriendUnit].m_FriendMap.begin();
  1310. for (; i != m_AllFriendUnits[m_nCurentFriendUnit].m_FriendMap.end(); i++)
  1311. {
  1312. if (strcmp(i->second.c_str(), groupname) == 0)
  1313. {
  1314. if (m_AllFriendUnits[m_nCurentFriendUnit].m_FriendOnlineMap.find(i->first) != m_AllFriendUnits[m_nCurentFriendUnit].m_FriendOnlineMap.end())
  1315. {
  1316. if (m_AllFriendUnits[m_nCurentFriendUnit].m_FriendOnlineMap[i->first] == stateOnline)
  1317. onlineList[i->first] = stateOnline;
  1318. else
  1319. offlineList[i->first] = stateOffline;
  1320. }
  1321. else
  1322. offlineList[i->first] = stateOffline;
  1323. }
  1324. }
  1325. m_nNumFriendInList = 0;
  1326. i = onlineList.begin();
  1327. while (i != onlineList.end() && m_nNumFriendInList < Group.nNumFriend)
  1328. {
  1329. strncpy(m_pFriendList[m_nNumFriendInList].Name, i->first.c_str(), 32);
  1330. m_pFriendList[m_nNumFriendInList].nData = 0;
  1331. m_nNumFriendInList++;
  1332. i++;
  1333. }
  1334. i = offlineList.begin();
  1335. while (i != offlineList.end() && m_nNumFriendInList < Group.nNumFriend)
  1336. {
  1337. strncpy(m_pFriendList[m_nNumFriendInList].Name, i->first.c_str(), 32);
  1338. m_pFriendList[m_nNumFriendInList].nData = m_uFriendOffLineColor;
  1339. m_nNumFriendInList++;
  1340. i++;
  1341. }
  1342. m_FriendList.SetContent((unsigned char*)m_pFriendList, m_nNumFriendInList, sizeof(KUiPlayerItem),
  1343. (int)&(((KUiPlayerItem*)0)->Name));
  1344. }
  1345. }
  1346. }
  1347. void KUiChatCentre::UpdateFriend(KUiPlayerItem* pFriend, int nGroupIndex)
  1348. {
  1349. if (pFriend == NULL)
  1350. return;
  1351. if (nGroupIndex == m_AllFriendUnits[m_nCurentFriendUnit].m_nCurExpandGroup && m_pFriendList)
  1352. {
  1353. UpdateGroup(nGroupIndex);
  1354. }
  1355. }
  1356. int KUiChatCentre::FriendUnit::FindGroupIndex(const std::string& str)
  1357. {
  1358. if (str.empty())
  1359. return 0;
  1360. for (int nIndex = 1; nIndex < MAX_GROUP_NUM; nIndex++)
  1361. {
  1362. if (m_GroupInfo[nIndex].strGroupName.empty())
  1363. {
  1364. return -1;
  1365. }
  1366. else if (m_GroupInfo[nIndex].strGroupName == str)
  1367. return nIndex;
  1368. }
  1369. return -1;
  1370. }
  1371. void KUiChatCentre::UpdateInterface()
  1372. {
  1373. int i;
  1374. m_UnitBtnFriend.CheckButton(0);
  1375. m_UnitBtnBrother.CheckButton(0);
  1376. m_UnitBtnEnemy.CheckButton(0);
  1377. m_UnitBtnOther.CheckButton(0);
  1378. if (m_nCurentFriendUnit == FRIEND_INDEX)
  1379. m_UnitBtnFriend.CheckButton(1);
  1380. else if (m_nCurentFriendUnit == BROTHER_INDEX)
  1381. m_UnitBtnBrother.CheckButton(1);
  1382. else if (m_nCurentFriendUnit == ENEMY_INDEX)
  1383. m_UnitBtnEnemy.CheckButton(1);
  1384. else
  1385. m_UnitBtnOther.CheckButton(1);
  1386. //先隐藏全部的组按钮
  1387. for (i = 0; i < MAX_GROUP_NUM; i++)
  1388. m_GroupBtn[i].Hide();
  1389. //计算好友列表之前组按钮的数目
  1390. int nNumGroupAhead = 0;
  1391. for (i = 0; i <= m_AllFriendUnits[m_nCurentFriendUnit].m_nCurExpandGroup; i++)
  1392. {
  1393. if (m_bValidGroup[i])
  1394. {
  1395. nNumGroupAhead++;
  1396. }
  1397. }
  1398. //计算好友列表显示的行数,至少要显示一行
  1399. int nFriendListLines = (m_nNumFriendInList > 1) ? m_nNumFriendInList : 1;
  1400. //组按钮的高度
  1401. int nBtnHeight;
  1402. m_GroupBtn[0].GetSize(NULL, &nBtnHeight);
  1403. //调整确认被显示的第一行内容的位置
  1404. int nLimitLine = m_nNumValidGroup + nFriendListLines;
  1405. int nContentWndHeight = m_nNumVisibleLine * m_nLineHeight;
  1406. int nHeight = nContentWndHeight; //从此处开始,nHeight表示窗口剩余的高度
  1407. while(true)
  1408. {
  1409. //好友列表后的组按钮
  1410. if (m_nNumValidGroup - nNumGroupAhead)
  1411. {
  1412. i = nHeight / nBtnHeight;
  1413. if (m_nNumValidGroup - nNumGroupAhead > i)
  1414. {
  1415. nLimitLine -= i;
  1416. break;
  1417. }
  1418. nHeight -= (m_nNumValidGroup - nNumGroupAhead) * nBtnHeight;
  1419. nLimitLine -= m_nNumValidGroup - nNumGroupAhead;
  1420. }
  1421. //好友列表
  1422. i = nHeight / m_nLineHeight;
  1423. if (nFriendListLines > i)
  1424. {
  1425. nLimitLine -= i;
  1426. break;
  1427. }
  1428. nHeight -= nFriendListLines * m_nLineHeight;
  1429. nLimitLine -= nFriendListLines;
  1430. //好友列表前的组按钮
  1431. i = nHeight / nBtnHeight;
  1432. if (nNumGroupAhead > i)
  1433. nLimitLine = nNumGroupAhead - i;
  1434. else
  1435. nLimitLine = 0;
  1436. break;
  1437. }
  1438. if (m_nFirstVisibleLine > nLimitLine)
  1439. m_nFirstVisibleLine = nLimitLine;
  1440. int nGroupIndex = 0, nLineIndex = 0;
  1441. int nTop = 0; //nTop用于表示已显示内容的高度
  1442. //前面跳过不显示的组按钮
  1443. for (; nLineIndex < m_nFirstVisibleLine &&
  1444. nGroupIndex <= m_AllFriendUnits[m_nCurentFriendUnit].m_nCurExpandGroup && nGroupIndex < MAX_GROUP_NUM;
  1445. nGroupIndex++)
  1446. {
  1447. if (m_bValidGroup[nGroupIndex])
  1448. {
  1449. nLineIndex++;
  1450. }
  1451. }
  1452. //显示当前展开组前(包括)的组按钮
  1453. for (; nGroupIndex <= m_AllFriendUnits[m_nCurentFriendUnit].m_nCurExpandGroup && nGroupIndex < MAX_GROUP_NUM; nGroupIndex++)
  1454. {
  1455. if (m_bValidGroup[nGroupIndex])
  1456. {
  1457. m_GroupBtn[nGroupIndex].Show();
  1458. m_GroupBtn[nGroupIndex].SetPosition(m_nFirstGroupBtnLeft, nTop + m_nFirstGroupBtnTop);
  1459. nTop += nBtnHeight;
  1460. if (nTop >= nContentWndHeight)
  1461. break;
  1462. }
  1463. }
  1464. m_FriendList.Hide();
  1465. if (nTop >= nContentWndHeight)
  1466. return;
  1467. //===处理好友列表的显示===
  1468. int nNumFriendSkip = 0; //头前要跳过显示的好友的数目
  1469. nHeight = 0; //从此处开始,nHeight表示好友列表窗口的显示高度
  1470. if (nLimitLine == 0)
  1471. {
  1472. nHeight = nContentWndHeight - m_nNumValidGroup * nBtnHeight;
  1473. }
  1474. else
  1475. {
  1476. if (nLineIndex < m_nFirstVisibleLine)
  1477. {
  1478. nNumFriendSkip = m_nFirstVisibleLine - nLineIndex;
  1479. if (nFriendListLines > nNumFriendSkip)
  1480. {
  1481. nFriendListLines -= nNumFriendSkip;
  1482. nLineIndex += nNumFriendSkip;
  1483. }
  1484. else
  1485. {
  1486. nFriendListLines = 0;
  1487. nLineIndex += nFriendListLines;
  1488. }
  1489. }
  1490. nHeight = nContentWndHeight - nTop;
  1491. if (nHeight / m_nLineHeight < nFriendListLines)
  1492. nFriendListLines = nHeight / m_nLineHeight;
  1493. else
  1494. nHeight = nFriendListLines * m_nLineHeight;
  1495. }
  1496. if (nHeight)
  1497. {
  1498. //设置好友列表窗口的位置
  1499. int x;
  1500. m_FriendList.GetPosition(&x, NULL);
  1501. m_FriendList.SetPosition(x, nTop + m_nFirstGroupBtnTop);
  1502. m_FriendList.GetSize(&x, NULL);
  1503. m_FriendList.SetSize(x, nHeight);
  1504. m_FriendList.SetTopItemIndex(nNumFriendSkip);
  1505. m_FriendList.Show();
  1506. nLineIndex += nFriendListLines;
  1507. nTop += nHeight;
  1508. }
  1509. if (nTop >= nContentWndHeight)
  1510. return;
  1511. //当前展开组后的组按钮
  1512. for (; nGroupIndex < MAX_GROUP_NUM; nGroupIndex++)
  1513. {
  1514. if (m_bValidGroup[nGroupIndex])
  1515. {
  1516. if (nLineIndex < m_nFirstVisibleLine)
  1517. nLineIndex ++;
  1518. else
  1519. {
  1520. m_GroupBtn[nGroupIndex].Show();
  1521. m_GroupBtn[nGroupIndex].SetPosition(m_nFirstGroupBtnLeft, nTop + m_nFirstGroupBtnTop);
  1522. nTop += nBtnHeight;
  1523. if (nTop >= nContentWndHeight)
  1524. break;
  1525. }
  1526. }
  1527. }
  1528. }
  1529. //绘制窗口
  1530. void KUiChatCentre::PaintWindow()
  1531. {
  1532. m_ListBgImage.oPosition.nX = m_nAbsoluteLeft + m_ListBgImgLeft;
  1533. m_ListBgImage.oPosition.nY = m_nAbsoluteTop + m_ListBgImgTop;
  1534. for (int i = 0; i < m_nNumVisibleLine; i++)
  1535. {
  1536. g_pRepresentShell->DrawPrimitives(1, &m_ListBgImage, RU_T_IMAGE, true);
  1537. m_ListBgImage.oPosition.nY += m_nLineHeight;
  1538. }
  1539. KWndShowAnimate::PaintWindow();
  1540. }
  1541. void KUiChatCentre::AdjustSize(int nNumLine)
  1542. {
  1543. if (nNumLine < m_nMinVisibleLine)
  1544. nNumLine = m_nMinVisibleLine;
  1545. else if (nNumLine > m_nMaxVisibleLine)
  1546. nNumLine = m_nMaxVisibleLine;
  1547. int nOffsetY = (nNumLine - m_nNumVisibleLine) * m_nLineHeight;
  1548. m_nNumVisibleLine = nNumLine;
  1549. int x, y;
  1550. m_FindBtn.GetPosition(&x, &y);
  1551. y += nOffsetY;
  1552. m_FindBtn.SetPosition(x, y);
  1553. m_ScrollDownBtn.GetPosition(&x, &y);
  1554. y += nOffsetY;
  1555. m_ScrollDownBtn.SetPosition(x, y);
  1556. m_CloseBtn.GetPosition(&x, &y);
  1557. y += nOffsetY;
  1558. m_CloseBtn.SetPosition(x, y);
  1559. m_TailImg.GetPosition(&x, &y);
  1560. y += nOffsetY;
  1561. m_TailImg.SetPosition(x, y);
  1562. m_TailImg.GetSize(&x, &nOffsetY);
  1563. y += nOffsetY;
  1564. GetSize(&x, NULL);
  1565. SetSize(x, y);
  1566. UpdateInterface();
  1567. }
  1568. //判断一个点是否在窗口范围内,传入的是绝对坐标
  1569. int KUiChatCentre::PtInWindow(int x, int y)
  1570. {
  1571. int nRet = 0;
  1572. if (KWndWindow::PtInWindow(x, y))
  1573. {
  1574. if (x > m_nAbsoluteLeft + m_ListBgImgLeft &&
  1575. y > m_nAbsoluteTop + m_nFirstGroupBtnTop &&
  1576. x < m_nAbsoluteLeft + m_nFirstGroupBtnLeft + m_ListBgImgWidth &&
  1577. y < m_nAbsoluteTop + m_nFirstGroupBtnTop + m_nNumVisibleLine * m_nLineHeight)
  1578. {
  1579. nRet = 1;
  1580. }
  1581. if (nRet == 0)
  1582. {
  1583. nRet = KWndShowAnimate::PtInWindow(x, y);
  1584. if (nRet == 0)
  1585. {
  1586. nRet = m_TailImg.PtInWindow(x, y);
  1587. }
  1588. }
  1589. }
  1590. return nRet;
  1591. }