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

模拟服务器

开发平台:

C/C++

  1. /*****************************************************************************************
  2. // 浮动提示窗口
  3. // Copyright : Kingsoft 2002-2003
  4. // Author :   Wooy(Wu yue)
  5. // CreateTime: 2002-12-23
  6. *****************************************************************************************/
  7. #include "KWin32.h"
  8. #include "KIniFile.h"
  9. #include "MouseHover.h"
  10. #include "AutoLocateWnd.h"
  11. #include "WndWindow.h"
  12. #include "../UiBase.h"
  13. #include "../../../Represent/iRepresent/iRepresentShell.h"
  14. #include "../../../Engine/Src/Text.h"
  15. #include "SpecialFuncs.h"
  16. extern iRepresentShell* g_pRepresentShell;
  17. #include "../../../core/src/CoreShell.h"
  18. extern iCoreShell* g_pCoreShell;
  19. KMouseOver g_MouseOver;
  20. #define SCHEME_INI "弹出说明文字.ini"
  21. #define INFO_MIN_LEN 26
  22. #define FOLLOW_CURSOR_OFFSET_X 16
  23. #define FOLLOW_CURSOR_OFFSET_Y 8
  24. static unsigned int s_uHoverObjDestTextColor = 0xffffffff; //对象提示文字的颜色
  25. void SetHoverObjDescColor(unsigned int uColor)
  26. {
  27. s_uHoverObjDestTextColor = uColor;
  28. }
  29. void SetMouseHoverObjectDesc(void* pWnd, int nObj, unsigned int uGenre,
  30. unsigned int uId, int nContainer, int x, int y)
  31. {
  32. KGameObjDesc Desc;
  33. int nLenTitle = 0, nLenProp = 0, nLenDesc = 0;
  34. g_MouseOver.CancelMouseHoverInfo();
  35. if (g_pCoreShell)
  36. {
  37. KUiObjAtContRegion Obj;
  38. Obj.Obj.uGenre = uGenre;
  39. Obj.Obj.uId = uId;
  40. Obj.Region.h = Obj.Region.v = 0;
  41. Obj.Region.Width = Obj.Region.Height = 0;
  42. Obj.nContainer = nContainer;
  43. Desc.szDesc[0] = 0;
  44. Desc.szProp[0] = 0;
  45. Desc.szTitle[0] = 0;
  46. unsigned uIndex = GDI_GAME_OBJ_DESC;
  47. if (g_UiBase.GetStatus() == UIS_S_TRADE_REPAIR)
  48. uIndex = GDI_GAME_OBJ_DESC_INCLUDE_REPAIRINFO;
  49. else if (g_UiBase.GetStatus() != UIS_S_IDLE)
  50. uIndex = GDI_GAME_OBJ_DESC_INCLUDE_TRADEINFO;
  51. g_pCoreShell->GetGameData(uIndex, (unsigned int)&Obj, (int)&Desc);
  52. g_MouseOver.SetMouseHoverInfo(pWnd, nObj, x, y, false, false);
  53. if (Desc.szTitle[0])
  54. {
  55. nLenTitle = TEncodeText(Desc.szTitle, strlen(Desc.szTitle));
  56. g_MouseOver.SetMouseHoverTitle(Desc.szTitle, nLenTitle,s_uHoverObjDestTextColor);
  57. }
  58. if (Desc.szProp[0])
  59. {
  60. nLenProp = TEncodeText(Desc.szProp, strlen(Desc.szProp));
  61. g_MouseOver.SetMouseHoverProp(Desc.szProp, nLenProp, s_uHoverObjDestTextColor);
  62. }
  63. if (Desc.szDesc[0])
  64. {
  65. nLenDesc = TEncodeText(Desc.szDesc, strlen(Desc.szDesc));
  66. g_MouseOver.SetMouseHoverDesc(Desc.szDesc, nLenDesc, s_uHoverObjDestTextColor);
  67. }
  68. }
  69. }
  70. int DrawDraggingGameObjFunc(int x, int y, const KUiDraggedObject& Obj, int nDropQueryResult)
  71. {
  72. g_pCoreShell->DrawGameObj(Obj.uGenre, Obj.uId, x, y, 0, 0, 0);
  73. return false;
  74. }
  75. KMouseOver::KMouseOver()
  76. {
  77. m_nImgWidth  = 0;
  78. m_nImgHeight = 0;
  79. m_nLeft      = 0;
  80. m_nTop       = 0;
  81. m_nWndWidth  = 0;
  82. m_nWndHeight = 0;
  83. m_nIndent    = 0;
  84. m_nFontSize  = 12;
  85. m_pMouseHoverWnd = NULL;
  86. m_nObj = 0;
  87. m_ObjTitle[0]  =0;
  88. m_nTitleLen    = 0;
  89. m_ObjProp[0]   = 0;
  90. m_nPropLen     = 0;
  91. m_ObjDesc[0]   = 0;
  92. m_nDescLen     = 0;
  93. m_uTitleColor  = 0;
  94. m_uPropColor   = 0;
  95. m_uDescColor   = 0;
  96. m_uTitleBgColor= 0;
  97. m_uPropBgColor = 0;
  98. m_uDescBgColor = 0;
  99. memset(&m_Image, 0, sizeof(KRUImage));
  100. m_bHeadTailImg = true;
  101. m_bFollowCursor = false;
  102. m_bShow = false;
  103. }
  104. int  KMouseOver::IsMoseHoverWndObj(void* pWnd, int nObj)
  105. {
  106. return ((pWnd == m_pMouseHoverWnd) && (nObj == m_nObj));
  107. }
  108. void KMouseOver::CancelMouseHoverInfo()
  109. {
  110. m_pMouseHoverWnd = 0;
  111. m_nObj = 0;
  112. m_ObjTitle[0] = 0;
  113. m_nTitleLen = 0;
  114. m_ObjProp[0] = 0;
  115. m_nPropLen = 0;
  116. m_ObjDesc[0] = 0;
  117. m_nDescLen = 0;
  118. m_bShow = false;
  119. }
  120. /***********************************************************************
  121. *功能:设置鼠标提示窗口的基本信息
  122. ************************************************************************/
  123. void KMouseOver::SetMouseHoverInfo(void* pWnd, int nObj, int x, int y,
  124.                         bool bHeadTailImg, bool bFollowCursor)
  125. {
  126.     m_pMouseHoverWnd = pWnd;
  127. m_nObj = nObj;
  128. m_bHeadTailImg = bHeadTailImg;
  129. m_bFollowCursor = bFollowCursor;
  130. m_nApplyX = x;
  131. m_nApplyY = y;
  132. m_ObjTitle[0] = 0;
  133. m_nTitleLen = 0;
  134. m_ObjProp[0] = 0;
  135. m_nPropLen = 0;
  136. m_ObjDesc[0] = 0;
  137. m_nDescLen = 0;
  138. m_bShow = false;
  139. }
  140. /***********************************************************************
  141. *功能:设置鼠标提示窗口的标题(物件的名字)
  142. ************************************************************************/
  143. void KMouseOver::SetMouseHoverTitle(const char *pTitleText, int nTitleTextLen, UINT uColor)
  144. {
  145. if (nTitleTextLen > 0 && pTitleText && nTitleTextLen <= GOD_MAX_OBJ_TITLE_LEN)
  146. {
  147. memcpy(m_ObjTitle, pTitleText, nTitleTextLen);
  148. m_nTitleLen = nTitleTextLen;
  149. m_uTitleColor = uColor;
  150. Update(m_nApplyX, m_nApplyY);
  151. }
  152. else
  153. {
  154. m_ObjTitle[0] = 0;
  155. m_nTitleLen = 0;
  156. }
  157. }
  158. /***********************************************************************
  159. *功能:设置鼠标提示窗口的物件属性
  160. ************************************************************************/
  161. void KMouseOver::SetMouseHoverProp(const char *pPropText, int nPropTextLen, UINT uColor)
  162. {
  163. if (nPropTextLen > 0 && pPropText && nPropTextLen <= GOD_MAX_OBJ_PROP_LEN)
  164. {
  165. memcpy(m_ObjProp, pPropText, nPropTextLen);
  166. m_nPropLen = nPropTextLen;
  167. m_uPropColor = uColor;
  168. Update(m_nApplyX, m_nApplyY);
  169. }
  170. else
  171. {
  172. m_ObjProp[0] = 0;
  173. m_nPropLen = 0;
  174. }
  175. }
  176. /***********************************************************************
  177. *功能:设置鼠标提示窗口的物件说明
  178. ************************************************************************/
  179. void KMouseOver::SetMouseHoverDesc(const char *pDescText, int nDescTextLen, UINT uColor)
  180. {
  181. if (nDescTextLen > 0 && pDescText && nDescTextLen <= GOD_MAX_OBJ_DESC_LEN)
  182. {
  183. memcpy(m_ObjDesc, pDescText, nDescTextLen);
  184. m_nDescLen = nDescTextLen;
  185. m_uDescColor = uColor;
  186. Update(m_nApplyX, m_nApplyY);
  187. }
  188. else
  189. {
  190. m_ObjDesc[0] = 0;
  191. m_nDescLen = 0;
  192. }
  193. }
  194. void KMouseOver::Update(int nX, int nY)
  195. {
  196. m_bShow = false;
  197. if (g_pRepresentShell == NULL)
  198. return;
  199. int nMaxTitleLen, nMaxPropLen, nMaxDescLen;
  200. m_nMaxLineLen = 0;
  201. if (m_nTitleLen > 0)
  202. {
  203. m_nTitleLineNum = TGetEncodedTextLineCount(
  204. m_ObjTitle, m_nTitleLen, 0, nMaxTitleLen, m_nFontSize);
  205. m_nMaxLineLen = nMaxTitleLen;
  206. }
  207. else
  208. {
  209. m_nTitleLineNum = 0;
  210. }
  211. if (m_nPropLen > 0)
  212. {
  213. m_nPropLineNum = TGetEncodedTextLineCount(
  214. m_ObjProp, m_nPropLen, 0, nMaxPropLen, m_nFontSize);
  215. if(m_nMaxLineLen < nMaxPropLen + 3) //此+3用于扩展tab字符占的空间
  216. m_nMaxLineLen = nMaxPropLen + 3;
  217. }
  218. else
  219. {
  220. m_nPropLineNum = 0;
  221. }
  222. if (m_nDescLineNum > 0)
  223. {
  224. m_nDescLineNum = TGetEncodedTextLineCount(
  225. m_ObjDesc, m_nDescLen, 0, nMaxDescLen, m_nFontSize);
  226. if(m_nMaxLineLen < nMaxDescLen)
  227.     m_nMaxLineLen = nMaxDescLen;
  228. }
  229. else
  230. {
  231. m_nDescLineNum = 0;
  232. }
  233. int nNumLine = m_nTitleLineNum + m_nPropLineNum + m_nDescLineNum;
  234. if (nNumLine == 0)
  235. return;
  236. if (m_bFollowCursor == false && m_nMaxLineLen < INFO_MIN_LEN)
  237. m_nMaxLineLen = INFO_MIN_LEN;
  238. m_nWndWidth = m_nFontSize * m_nMaxLineLen / 2 + m_nIndent * 2;
  239. m_nWndHeight = (m_nFontSize + 1) * nNumLine;
  240. if (m_bHeadTailImg)
  241. m_nWndHeight += m_nImgHeight * 2;
  242. if (m_bFollowCursor)
  243. {
  244. m_nLeft = nX + FOLLOW_CURSOR_OFFSET_X;
  245. m_nTop  = nY + FOLLOW_CURSOR_OFFSET_Y;
  246. }
  247. else
  248. {
  249. ALW_GetWndPosition(m_nLeft, m_nTop, m_nWndWidth, m_nWndHeight);
  250. }
  251. //可以显示浮动窗口啦!
  252. m_bShow = true;
  253. }
  254. //鼠标的位置更新了
  255. void KMouseOver::UpdateCursorPos(int nX, int nY)
  256. {
  257. if (m_bFollowCursor && m_bShow)
  258. {
  259. m_nLeft = nX + FOLLOW_CURSOR_OFFSET_X;
  260. m_nTop  = nY + FOLLOW_CURSOR_OFFSET_Y;
  261. }
  262. }
  263. void KMouseOver::OnWndClosed(void* pWnd)
  264. {
  265. if (pWnd && pWnd == m_pMouseHoverWnd)
  266. CancelMouseHoverInfo();
  267. }
  268. //载入界面方案
  269. void KMouseOver::LoadScheme(const char* pScheme)
  270. {
  271. if (pScheme == NULL)
  272. return;
  273. char Buff[128];
  274. KIniFile Ini;
  275. sprintf(Buff, "%s\%s", pScheme, SCHEME_INI);
  276. if (Ini.Load(Buff))
  277. {
  278. Ini.GetInteger("Main", "ImgWidth",    0, &m_nImgWidth);
  279. Ini.GetInteger("Main", "ImgHeight",   0, &m_nImgHeight);
  280. Ini.GetInteger("Main", "Indent",      0, &m_nIndent);
  281. Ini.GetInteger("Main", "Font",        0, &m_nFontSize);
  282. if(m_nImgWidth < 0)
  283. m_nImgWidth = 0;
  284. if(m_nImgHeight < 0)
  285. m_nImgWidth = 0;
  286. if(m_nFontSize < 8)
  287. m_nFontSize = 8;
  288. int nValue;
  289. Ini.GetInteger("Main", "ImgType", 0, &nValue);
  290. if (nValue == 1)
  291. {
  292. m_Image.nType = ISI_T_BITMAP16;
  293. m_Image.bRenderStyle = IMAGE_RENDER_STYLE_OPACITY;
  294. }
  295. else
  296. {
  297. m_Image.nType = ISI_T_SPR;
  298. m_Image.bRenderStyle = IMAGE_RENDER_STYLE_ALPHA;
  299. m_Image.Color.Color_b.a = 255;
  300. }
  301. m_Image.uImage = 0;
  302. m_Image.nISPosition = IMAGE_IS_POSITION_INIT;
  303. Ini.GetString("Main", "Image", "" , m_Image.szImage, sizeof(m_Image.szImage));
  304. Ini.GetInteger("Main", "Frame", 0, &nValue);
  305. m_Image.nFrame = nValue;
  306. Ini.GetString("Main", "TitleBgColor", "0, 0, 0", Buff, sizeof(Buff));
  307. m_uTitleBgColor = ((GetColor(Buff) & 0xffffff) | 0x0a000000);
  308. Ini.GetString("Main", "PropBgColor", "0, 0, 0", Buff, sizeof(Buff));
  309. m_uPropBgColor = ((GetColor(Buff) & 0xffffff) | 0x0a000000);
  310. Ini.GetString("Main", "DescBgColor", "0, 0, 0", Buff, sizeof(Buff));
  311. m_uDescBgColor = ((GetColor(Buff) & 0xffffff) | 0x0a000000);
  312. Update((m_nLeft + m_nWndWidth) / 2, m_nTop);
  313. }
  314. }
  315. void KMouseOver::PaintMouseHoverInfo()
  316. {
  317. if (m_bShow == false || g_pRepresentShell == NULL)
  318. return;
  319. //画背景阴影和边框
  320. KRUShadow Shadow;
  321. //写文字初始化
  322. KOutputTextParam Param;
  323. Param.BorderColor = 0;
  324. Param.nZ = TEXT_IN_SINGLE_PLANE_COORD;
  325. //====标题(名字)部分====
  326. Shadow.oPosition.nX = m_nLeft;
  327. Shadow.oPosition.nY = m_nTop;
  328. if (m_bHeadTailImg)
  329. Shadow.oPosition.nY = m_nTop + m_nImgHeight;
  330. else
  331. Shadow.oPosition.nY = m_nTop;
  332. Shadow.oEndPos.nX = m_nLeft + m_nWndWidth;
  333. Shadow.oEndPos.nY = Shadow.oPosition.nY;
  334. if(m_nTitleLen > 0)
  335. {
  336. Shadow.Color.Color_dw = m_uTitleBgColor;
  337. Shadow.oEndPos.nY += (m_nFontSize + 1) * m_nTitleLineNum;
  338. g_pRepresentShell->DrawPrimitives(1, &Shadow, RU_T_SHADOW, true);
  339. Param.nSkipLine = 0;
  340. Param.nNumLine = 1;
  341. Param.Color = m_uTitleColor;
  342. Param.nY = Shadow.oPosition.nY;
  343. int nLineLen;
  344. while(true)
  345. {
  346. if (TGetEncodedTextLineCount(m_ObjTitle, m_nTitleLen, 0, nLineLen, m_nFontSize, Param.nSkipLine, 1) == 0)
  347. break;
  348. Param.nX = m_nLeft + m_nWndWidth / 2 - (nLineLen * m_nFontSize) / 4;
  349. g_pRepresentShell->OutputRichText(m_nFontSize, &Param, m_ObjTitle, m_nTitleLen, 0);
  350. Param.nSkipLine ++;
  351. Param.nY += m_nFontSize + 1;
  352. };
  353. }
  354. //====属性部分====
  355. if(m_nPropLen > 0)
  356. {
  357. Shadow.Color.Color_dw = m_uPropBgColor;
  358. Shadow.oPosition.nY = Shadow.oEndPos.nY;
  359. Shadow.oEndPos.nY += (m_nFontSize + 1) * m_nPropLineNum;
  360. g_pRepresentShell->DrawPrimitives(1, &Shadow, RU_T_SHADOW, true);
  361. Param.nSkipLine = 0;
  362. Param.Color = m_uPropColor;
  363. Param.nNumLine = m_nPropLineNum;
  364. Param.nX = m_nLeft + m_nIndent;
  365. Param.nY = Shadow.oPosition.nY;
  366. OutputTabSplitText(m_ObjProp, m_nPropLen, m_nWndWidth - m_nIndent * 2, m_nFontSize, &Param);
  367. }
  368. //====描述部分====
  369. if(m_nDescLen > 0)
  370. {
  371. Shadow.Color.Color_dw = m_uDescBgColor;
  372. Shadow.oPosition.nY = Shadow.oEndPos.nY;
  373. Shadow.oEndPos.nY += (m_nFontSize + 1) * m_nDescLineNum;
  374. g_pRepresentShell->DrawPrimitives(1, &Shadow, RU_T_SHADOW, true);
  375. Param.nSkipLine = 0;
  376. Param.Color = m_uDescColor;
  377. Param.nNumLine = m_nDescLineNum;
  378. Param.nX = m_nLeft + m_nIndent;
  379. Param.nY = Shadow.oPosition.nY;
  380. g_pRepresentShell->OutputRichText(m_nFontSize, &Param, m_ObjDesc, m_nDescLen, 0);
  381. }
  382. //画底图和边框图
  383. if (m_bHeadTailImg && m_nImgWidth > 0)
  384. {
  385. m_Image.oPosition.nX = m_nLeft;
  386. while(m_Image.oPosition.nX < m_nLeft + m_nWndWidth)
  387. {
  388. m_Image.oPosition.nY = m_nTop;
  389. g_pRepresentShell->DrawPrimitives(1, &m_Image, RU_T_IMAGE, true);
  390. m_Image.oPosition.nY = Shadow.oEndPos.nY;
  391. g_pRepresentShell->DrawPrimitives(1, &m_Image, RU_T_IMAGE, true);
  392. m_Image.oPosition.nX += m_nImgWidth;
  393. };
  394. }
  395. }
  396. /***********************************************************************
  397. *功能:按既定的最大宽度把属性部分格式化(左右靠)
  398. ************************************************************************/
  399. /*void KMouseOver::FormatProp()
  400. {
  401.     if(m_ObjProp[0])
  402. {
  403. char szBuffer[MAX_OBJ_PROP_LEN], *pPos = NULL, *pHead = NULL, *pTail = NULL;
  404.     int nLeftLen = 0, nRightLen = 0, i, j, k;
  405.         //初始准备
  406. memset(szBuffer, 0, MAX_OBJ_PROP_LEN);
  407. memcpy(szBuffer, m_ObjProp, m_nPropLen);
  408. memset(m_ObjProp, 0, MAX_OBJ_PROP_LEN);
  409.     szBuffer[MAX_OBJ_PROP_LEN - 1] = 0;
  410. pHead = szBuffer;
  411. //开始循环处理
  412.         while(pHead[0])
  413.     {
  414.             pPos = strchr(pHead, 0x20);
  415. if(pPos == NULL) break;
  416. nLeftLen = pPos - pHead;
  417. pTail = strchr(pPos, 0x0a);
  418. if(pTail == NULL)
  419. {
  420. pTail = strlen(pPos) + pPos;
  421. if((pTail - pPos) <= 1)
  422.     break;
  423. }
  424. nRightLen = pTail - pPos - 1;
  425. *pPos = *pTail = 0;
  426. strcat(m_ObjProp, pHead);
  427. j = m_nMaxLineLen - nLeftLen - nRightLen;
  428. k = strlen(m_ObjProp);
  429. for(i=0;i < j;i++)
  430. {
  431. m_ObjProp[k] = ' ';
  432. k++;
  433. }
  434. m_ObjProp[k] = 0;
  435. strcat(m_ObjProp, pPos + 1);
  436. k = strlen(m_ObjProp);
  437. m_ObjProp[k] = 0x0a;
  438. m_ObjProp[k+1] = 0;
  439. pHead = pTail + 1;
  440. pPos =  NULL;
  441. pTail = NULL;
  442.     };
  443. j = strlen(m_ObjProp);
  444. m_ObjProp[j] = 0;
  445.     m_nPropLen = strlen(m_ObjProp);
  446.     }
  447. }*/