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

模拟服务器

开发平台:

C/C++

  1. /* 
  2.  * File:     UiFaceSelector.cpp
  3.  * Desc:     表情选择窗口
  4.  * Author:   flying
  5.  * Creation: 2003/7/8
  6.  * 今天是偶老婆的生日哦,呵呵
  7.  */
  8. //-----------------------------------------------------------------------------
  9. #include "KWin32.h"
  10. #include "KIniFile.h"
  11. #include "../Elem/Wnds.h"
  12. #include "../Elem/WndMessage.h"
  13. #include "../Elem/MouseHover.h"
  14. #include "UiFaceSelector.h"
  15. #include "../UiBase.h"
  16. #include "../UiSoundSetting.h"
  17. #include "../../../Represent/iRepresent/iRepresentShell.h"
  18. #include "../../../Represent/iRepresent/KRepresentUnit.h"
  19. #include "../../../Engine/src/Text.h"
  20. #include <crtdbg.h>
  21. extern iRepresentShell* g_pRepresentShell;
  22. KUiFaceSelector* KUiFaceSelector::m_pSelf = NULL;
  23. KUiFaceSelector::KFaceItem* KUiFaceSelector::ms_pFaceList = NULL;
  24. int KUiFaceSelector::ms_nNumFaces = 0;
  25. #define SCHEME_INI_FACE "表情符号选择窗口.ini"
  26. #define SCHEME_INI_FACE_DETAIL  "\Ui\表情大全.ini"
  27. KUiFaceSelector::KUiFaceSelector()
  28. {
  29. m_nCurrIndex = -1;
  30. m_bIsExpandMode = FALSE;
  31. m_pCallerWnd = NULL;
  32. m_pvCallerParam = NULL;
  33. m_nNormColuCount = 0;
  34. m_nExpColuCount = 0;
  35. m_nRowCount = 0;
  36. m_nBtnWidth = m_nBtnHeight = 1;
  37. m_nIndentH = m_nIndentV = 0;
  38. }
  39. KUiFaceSelector* KUiFaceSelector::OpenWindow(KWndWindow* pCaller, void* pvParam)
  40. {
  41. if (m_pSelf == NULL)
  42. {
  43. m_pSelf = new KUiFaceSelector;
  44. if (m_pSelf)
  45. m_pSelf->Initialize();
  46. }
  47. if (m_pSelf)
  48. {
  49. m_pSelf->m_pCallerWnd = pCaller;
  50. m_pSelf->m_pvCallerParam = pvParam;
  51. UiSoundPlay(UI_SI_WND_OPENCLOSE);
  52. m_pSelf->Show();
  53. m_pSelf->BringToTop();
  54. }
  55. return m_pSelf;
  56. }
  57. void KUiFaceSelector::CloseWindow(bool bDestroy)
  58. {
  59. if (m_pSelf)
  60. {
  61. m_pSelf->Hide();
  62. if (bDestroy)
  63. {
  64. m_pSelf->Destroy();
  65. m_pSelf = NULL;
  66. }
  67. }
  68. }
  69. KUiFaceSelector* KUiFaceSelector::GetIfVisible()
  70. {
  71. if (m_pSelf && m_pSelf->IsVisible())
  72. return m_pSelf;
  73. else
  74. return NULL;
  75. }
  76. int KUiFaceSelector::ConvertFaceText(char* pDest, const char* pSrc, int nCount)
  77. {
  78. if (pDest == NULL || pSrc == NULL || nCount < 0)
  79. return 0;
  80. int nConvertCount = 0;
  81. unsigned char cCharacter;
  82. int nReadPos = 0;
  83. while(nReadPos < nCount)
  84. {
  85. cCharacter = pSrc[nReadPos];
  86. if (cCharacter > 0x80)
  87. {
  88. if (nReadPos + 1 < nCount) //是可能是中文文字
  89. {
  90. pDest[nConvertCount++] = cCharacter;
  91. pDest[nConvertCount++] = pSrc[nReadPos+ 1];
  92. nReadPos += 2;
  93. }
  94. else //大于0x80的单字节西文字符被过滤掉
  95. break;
  96. }
  97. else if (cCharacter == 0x0d) //换行
  98. {
  99. if (nReadPos + 1 < nCount && pSrc[nReadPos + 1] == 0x0a)
  100. nReadPos += 2;
  101. else
  102. nReadPos ++;
  103. pDest[nConvertCount++] = 0x0a;
  104. }
  105. else if((cCharacter >= 0x20 && cCharacter < 0x7F) || cCharacter == 0x0a)
  106. {
  107. if (!ConvertFace(pDest, nConvertCount, pSrc, nCount, nReadPos))
  108. {
  109. pDest[nConvertCount++] = cCharacter;
  110. nReadPos++;
  111. }
  112. }
  113. else
  114. nReadPos++;
  115. }
  116. return nConvertCount;
  117. }
  118. //--------------------------------------------------------------------------
  119. // 功能:转换表情符
  120. //--------------------------------------------------------------------------
  121. int KUiFaceSelector::ConvertFace(char* pDest, int& nConvertCount, const char* pSrc, int nCount, int& nReadPos)
  122. {
  123. int nRemainCount = nCount - nReadPos;
  124. _ASSERT(pDest != NULL && pSrc != NULL && nRemainCount > 0);
  125. for (int i = 0; i < ms_nNumFaces; i++)
  126. {
  127. int nLen = strlen(ms_pFaceList[i].szFaceText);
  128. if (nLen <= nRemainCount && memcmp(ms_pFaceList[i].szFaceText, pSrc + nReadPos, nLen) == 0)
  129. {
  130. nConvertCount += sprintf(pDest + nConvertCount, "<pic=%d>", i);
  131. nReadPos += nLen;
  132. return true;
  133. }
  134. }
  135. return false;
  136. }
  137. //初始化
  138. void KUiFaceSelector::Initialize()
  139. {
  140. AddChild(&m_LessBtn);
  141. AddChild(&m_MoreBtn);
  142. char szScheme[128];
  143. g_UiBase.GetCurSchemePath(szScheme, sizeof(szScheme));
  144. LoadScheme(szScheme);
  145. Wnd_AddWindow(this, WL_TOPMOST);
  146. }
  147. void KUiFaceSelector::LoadFaceList()
  148. {
  149. if (ms_pFaceList == NULL)
  150. {
  151. free (ms_pFaceList);
  152. ms_pFaceList = NULL;
  153. }
  154. ms_nNumFaces = 0;
  155. KIniFile Ini;
  156. if (Ini.Load(SCHEME_INI_FACE_DETAIL))
  157. {
  158. int nCount, i;
  159. char szSection[8];
  160. Ini.GetInteger("List", "Count", 0, &nCount);
  161. if (nCount > 0)
  162. {
  163. ms_pFaceList = (KFaceItem*)malloc(sizeof(KFaceItem) * nCount);
  164. if (ms_pFaceList)
  165. {
  166. ms_nNumFaces = nCount;
  167. for (i = 0; i < nCount; i++)
  168. {
  169. sprintf(szSection, "Face%d", i + 1);
  170. Ini.GetString(szSection, "Text", "", ms_pFaceList[i].szFaceText,
  171. sizeof(ms_pFaceList[i].szFaceText));
  172. Ini.GetString(szSection, "Tip", "", ms_pFaceList[i].szFaceTip,
  173. sizeof(ms_pFaceList[i].szFaceTip));
  174. }
  175. }
  176. }
  177. }
  178. }
  179. void KUiFaceSelector::Clear()
  180. {
  181. if (m_pSelf)
  182. m_pSelf->CloseWindow(true);
  183. if (ms_pFaceList)
  184. {
  185. free (ms_pFaceList);
  186. ms_pFaceList = NULL;
  187. }
  188. ms_nNumFaces = 0;
  189. }
  190. void KUiFaceSelector::OnSelFace()
  191. {
  192. if (m_pCallerWnd && m_nCurrIndex >= 0 && m_nCurrIndex < ms_nNumFaces)
  193. {
  194. m_pCallerWnd->WndProc(WND_M_OTHER_WORK_RESULT,
  195. (unsigned int)m_pvCallerParam, (int)ms_pFaceList[m_nCurrIndex].szFaceText);
  196. }
  197. CloseWindow(false);
  198. }
  199. int KUiFaceSelector::WndProc(unsigned int uMsg, unsigned int uParam, int nParam)
  200. {
  201. int nResult = false;
  202. switch(uMsg)
  203. {
  204. case WM_LBUTTONDOWN:
  205. case WM_RBUTTONDOWN:
  206. m_nCurrIndex = GetFaceAtPos(LOWORD(nParam), HIWORD(nParam));
  207. OnSelFace();
  208. nResult = true;
  209. break;
  210. case WM_MOUSEMOVE:
  211. {
  212. int x = (int)(short)(LOWORD(nParam));
  213. int y = (int)(short)(HIWORD(nParam));
  214. int nIndex = GetFaceAtPos(x, y);
  215. if (nIndex != m_nCurrIndex)
  216. {
  217. m_nCurrIndex = nIndex;
  218. UpdateFaceTip(x, y);
  219. }
  220. }
  221. nResult = true;
  222. break;
  223. case WND_N_BUTTON_OVER:
  224. if (m_nCurrIndex >= 0)
  225. {
  226. m_nCurrIndex = -1;
  227. UpdateFaceTip(0, 0);
  228. }
  229. break;
  230. case WND_N_BUTTON_CLICK:
  231. if(uParam == (unsigned int)&m_MoreBtn)
  232. OnExpandWnd();
  233. else if(uParam == (unsigned int)&m_LessBtn)
  234. OnUnExpandWnd();
  235. nResult = true;
  236. break;
  237. default:
  238. nResult = KWndWindow::WndProc(uMsg, uParam, nParam);
  239. break;
  240. }
  241. return nResult;
  242. }
  243. void KUiFaceSelector::OnExpandWnd()
  244. {
  245. if (m_bIsExpandMode)
  246. return;
  247. m_bIsExpandMode = TRUE;
  248. m_MoreBtn.Hide();
  249. m_LessBtn.Show();
  250. SetSize(m_nBtnWidth * (m_nNormColuCount + m_nExpColuCount), m_Height);
  251. }
  252. void KUiFaceSelector::OnUnExpandWnd()
  253. {
  254. if (m_bIsExpandMode == FALSE)
  255. return;
  256. m_bIsExpandMode = FALSE;
  257. m_LessBtn.Hide();
  258. m_MoreBtn.Show();
  259. SetSize(m_nBtnWidth * m_nNormColuCount, m_Height);
  260. }
  261. void KUiFaceSelector::LoadScheme(const char* pScheme)
  262. {
  263. char Buff[128];
  264. KIniFile Ini;
  265. sprintf(Buff, "%s\%s", pScheme, SCHEME_INI_FACE);
  266. if (Ini.Load(Buff))
  267. {
  268. Init(&Ini, "Main");
  269. m_MoreBtn.Init(&Ini, "BtnMore");
  270. m_LessBtn.Init(&Ini, "BtnLess");
  271. Ini.GetInteger("Main", "ColumnCount", 0, &m_nNormColuCount);
  272. Ini.GetInteger("Main", "BigColumnCount", 0, &m_nExpColuCount);
  273. Ini.GetInteger("Main", "Row", 0, &m_nRowCount);
  274. Ini.GetInteger("Main", "BtnWidth", 1, &m_nBtnWidth);
  275. if (m_nBtnWidth < 1)
  276. m_nBtnWidth = 1;
  277. Ini.GetInteger("Main", "BtnHeight", 1, &m_nBtnHeight);
  278. if (m_nBtnHeight < 1)
  279. m_nBtnHeight = 1;
  280. Ini.GetInteger("Main", "IndentH", 0, &m_nIndentH);
  281. Ini.GetInteger("Main", "IndentV", 0, &m_nIndentV);
  282. // Now let's get the color configuration information
  283. Ini.GetString("Main", "BgColor", "0,0,0", Buff, 128);
  284. m_nBgColor = (GetColor(Buff) & 0x00ffffff);
  285. Ini.GetString("Main", "BgOver", "0,0,0", Buff, 128);
  286. m_nBgOver = (GetColor(Buff) & 0x00ffffff);
  287. Ini.GetString("Main", "BorderColor", "0,0,0", Buff, 128);
  288. m_nBorderColor = GetColor(Buff);// & 0x00ffffff); // alpha
  289. Ini.GetInteger("Main", "BgAlpha", 0, (int*)&m_nBgAlpha);
  290. m_nBgColor |= (m_nBgAlpha << 24); // 处理alpha
  291. /* if (ms_nNumFaces <= m_nNormColuCount)
  292. {
  293. m_Width = (MAX_SPACE + m_nBtnWidth) * ms_nNumFaces + MAX_SPACE;
  294. m_Height = 2 * MAX_SPACE + m_nBtnHeight;
  295. }
  296. else
  297. {
  298. int Lines = 0;
  299. m_Width = (MAX_SPACE + m_nBtnWidth) * m_nNormColuCount + MAX_SPACE;
  300. //if (ms_nNumFaces % m_nNormColuCount == 0)
  301. // Lines = ms_nNumFaces / m_nNormColuCount;
  302. //else
  303. // Lines = ms_nNumFaces / m_nNormColuCount + 1;
  304. m_Height = (MAX_SPACE + m_nBtnHeight) * m_nRowCount + MAX_SPACE;
  305. }
  306. */
  307. if (m_bIsExpandMode == FALSE)
  308. {
  309. m_MoreBtn.Show();
  310. m_LessBtn.Hide();
  311. SetSize(m_nBtnWidth * m_nNormColuCount, m_Height);
  312. }
  313. else
  314. {
  315. m_MoreBtn.Hide();
  316. m_LessBtn.Show();
  317. SetSize(m_nBtnWidth * (m_nNormColuCount + m_nExpColuCount), m_Height);
  318. }
  319. }
  320. return;
  321. }
  322. void KUiFaceSelector::UpdateFaceTip(int x, int y)
  323. {
  324. if (m_nCurrIndex >= 0)
  325. {
  326. char szToolTip[64] = "";
  327. sprintf(szToolTip, "%s(%s)", ms_pFaceList[m_nCurrIndex].szFaceTip,
  328. ms_pFaceList[m_nCurrIndex].szFaceText);
  329. g_MouseOver.SetMouseHoverInfo((void*)(KWndWindow*)this, m_nCurrIndex,
  330. x, y, false, true);
  331. g_MouseOver.SetMouseHoverTitle(szToolTip, strlen(szToolTip), 0xffffffff);
  332. }
  333. else
  334. {
  335. g_MouseOver.CancelMouseHoverInfo();
  336. }
  337. }
  338. void KUiFaceSelector::PaintWindow()
  339. {
  340. KWndWindow::PaintWindow();
  341. //==绘制底面==
  342. KRUShadow bg;
  343. bg.Color.Color_dw = m_nBgColor;
  344. bg.oPosition.nX = m_nAbsoluteLeft;
  345. bg.oPosition.nY = m_nAbsoluteTop;
  346. bg.oEndPos.nX = m_nAbsoluteLeft + m_Width;
  347. bg.oEndPos.nY = m_nAbsoluteTop + m_Height;
  348. bg.oEndPos.nZ = bg.oPosition.nZ = 0;
  349. g_pRepresentShell->DrawPrimitives(1, &bg, RU_T_SHADOW, true);
  350. int h, v, nCount;
  351. //==绘制分隔边框==
  352. KRULine line;
  353. line.Color.Color_dw = m_nBorderColor;
  354. line.oPosition.nX = m_nAbsoluteLeft;
  355. line.oEndPos.nX = m_nAbsoluteLeft + m_Width;
  356. line.oEndPos.nY = line.oPosition.nY = m_nAbsoluteTop;
  357. line.oEndPos.nZ = line.oPosition.nZ = 0;
  358. for (v = 0; v <= m_nRowCount; v++)
  359. {
  360. g_pRepresentShell->DrawPrimitives(1, &line, RU_T_LINE, true);
  361. line.oPosition.nY += m_nBtnHeight;
  362. line.oEndPos.nY = line.oPosition.nY;
  363. }
  364. if (m_bIsExpandMode)
  365. nCount = m_nNormColuCount + m_nExpColuCount;
  366. else
  367. nCount = m_nNormColuCount;
  368. line.oEndPos.nX = line.oPosition.nX = m_nAbsoluteLeft;
  369. line.oPosition.nY = m_nAbsoluteTop;
  370. line.oEndPos.nY = m_nAbsoluteTop + m_Height;
  371. for (h = 0; h <= nCount; h++)
  372. {
  373. g_pRepresentShell->DrawPrimitives(1, &line, RU_T_LINE, true);
  374. line.oPosition.nX += m_nBtnWidth;
  375. line.oEndPos.nX = line.oPosition.nX;
  376. }
  377. // draw the face pic
  378. int nIndex, nNumH, nStartX;
  379. char cBuffer[8];
  380. KOutputTextParam param;
  381. cBuffer[0] = KTC_INLINE_PIC;
  382. param.BorderColor = 0;
  383. param.bPicPackInSingleLine = false;
  384. param.Color = 0;
  385. param.nNumLine = 2;
  386. param.nSkipLine = 0;
  387. param.nVertAlign = 1;
  388. param.nZ = TEXT_IN_SINGLE_PLANE_COORD;
  389. //====绘制左侧表情图标的初始化====
  390. nIndex = 0;
  391. nCount = m_nRowCount * m_nNormColuCount;
  392. if (m_bIsExpandMode == FALSE)
  393. nCount--;
  394. if (nCount > ms_nNumFaces)
  395. nCount = ms_nNumFaces;
  396. nNumH = m_nNormColuCount;
  397. nStartX = m_nAbsoluteLeft + m_nIndentH;
  398. for (int nbRight = 0; nbRight <= 1; nbRight ++)
  399. {
  400. param.nY = m_nAbsoluteTop + m_nIndentV;
  401. for (v = 0; v < m_nRowCount; v++)
  402. {
  403. param.nX = nStartX;
  404. for (h = 0; h < nNumH; h++)
  405. {
  406. if (nIndex >= nCount)
  407. {
  408. v = m_nRowCount; //要外层循环也退出
  409. break;
  410. }
  411. if (nIndex == m_nCurrIndex)
  412. { //===绘制选中表情图标的底色===
  413. bg.Color.Color_dw = m_nBgOver;
  414. bg.oPosition.nX = param.nX - m_nIndentH;
  415. bg.oPosition.nY = param.nY - m_nIndentV;
  416. bg.oEndPos.nX = bg.oPosition.nX + m_nBtnWidth - 1;
  417. bg.oEndPos.nY = bg.oPosition.nY + m_nBtnHeight - 1;
  418. g_pRepresentShell->DrawPrimitives(1, &bg, RU_T_SHADOW, true);
  419. }
  420. *((WORD*)(cBuffer + 1)) = nIndex;
  421. g_pRepresentShell->OutputRichText(12, &param, cBuffer, 3);
  422. param.nX += m_nBtnWidth;
  423. nIndex ++;
  424. }
  425. param.nY += m_nBtnHeight;
  426. }
  427. if (m_bIsExpandMode == FALSE)
  428. break;
  429. //====绘制右侧表情图标的初始化====
  430. nCount = m_nRowCount * (m_nNormColuCount + m_nExpColuCount) - 1;
  431. if (nCount > ms_nNumFaces)
  432. nCount = ms_nNumFaces;
  433. nNumH = m_nExpColuCount;
  434. nStartX += nNumH * m_nBtnWidth;
  435. }
  436. }
  437. void KUiFaceSelector::Show()
  438. {
  439. Wnd_SetCapture(this);
  440. KWndWindow::Show();
  441. }
  442. void KUiFaceSelector::Hide()
  443. {
  444. Wnd_ReleaseCapture();
  445. KWndWindow::Hide();
  446. }
  447. int KUiFaceSelector::GetFaceAtPos(int x, int y)
  448. {
  449. int nIndex = -1;
  450. if (PtInWindow(x, y))
  451. {
  452. x = (x - m_nAbsoluteLeft) / m_nBtnWidth;
  453. y = (y - m_nAbsoluteTop) / m_nBtnHeight;
  454. if (x < m_nNormColuCount)
  455. {
  456. nIndex = m_nNormColuCount * y + x;
  457. }
  458. else
  459. {
  460. nIndex = m_nNormColuCount * m_nRowCount + m_nExpColuCount * y + (x - m_nNormColuCount);
  461. }
  462.     if (nIndex >= ms_nNumFaces)
  463. nIndex = -1;
  464. }
  465. return nIndex;
  466. }