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

模拟服务器

开发平台:

C/C++

  1. /*****************************************************************************************
  2. // 界面窗口体系结构--文本窗口
  3. // Copyright : Kingsoft 2002
  4. // Author :   Wooy(Wu yue)
  5. // CreateTime: 2002-7-23
  6. *****************************************************************************************/
  7. #include "KWin32.h"
  8. #include "KIniFile.h"
  9. #include "../Elem/WndMessage.h"
  10. #include "WndText.h"
  11. #include "../../../Engine/Src/Text.h"
  12. #include "../../../Represent/iRepresent/iRepresentShell.h"
  13. extern iRepresentShell* g_pRepresentShell;
  14. //--------------------------------------------------------------------------
  15. // 功能:构造函数
  16. //--------------------------------------------------------------------------
  17. KWndText::KWndText()
  18. {
  19. m_nFontSize = 12;
  20. m_pText = NULL;
  21. m_nTextLen   = 0;
  22. m_nBuffLen   = 0;
  23. m_nTopLine   = 0;
  24. m_nLineCount = 0;
  25. m_BorderColor = 0;
  26. }
  27. //--------------------------------------------------------------------------
  28. // 功能:设置文本文字
  29. //--------------------------------------------------------------------------
  30. void KWndText::SetText(const char* pText, int nLen/*= -1*/)
  31. {
  32. if (m_pText && g_pRepresentShell)
  33. {
  34. if (pText && pText[0])
  35. {
  36. if (nLen < 0)
  37. nLen = strlen(pText);
  38. if (nLen > m_nBuffLen)
  39. nLen = TSplitString(pText, m_nBuffLen - 1, true);
  40. memcpy(m_pText, pText, nLen);
  41. m_pText[nLen] = 0;
  42. m_nTextLen = nLen;
  43. if (m_Style & WNDTEXT_ES_MULTILINE)
  44. {
  45. int nLineLen;
  46. m_nLineCount = TGetEncodedTextLineCount(
  47. m_pText, m_nTextLen, (m_Width * 2) / m_nFontSize, nLineLen, m_nFontSize);
  48. }
  49. }
  50. else
  51. {
  52. m_pText[0] = 0;
  53. m_nTextLen = 0;
  54. m_nLineCount = 0;
  55. }
  56. m_nTopLine = 0;
  57. }
  58. }
  59. //--------------------------------------------------------------------------
  60. // 功能:获取字符串内容
  61. //--------------------------------------------------------------------------
  62. int KWndText::GetText(char* pBuffer, int nSize)
  63. {
  64. int nRet = 0;
  65. if (m_pText && pBuffer)
  66. {
  67. if (m_nTextLen + 1 <= nSize)
  68. {
  69. memcpy(pBuffer, m_pText, m_nTextLen + 1);
  70. nRet = m_nTextLen;
  71. }
  72. else
  73. nRet = m_nTextLen + 1;
  74. }
  75. return nRet;
  76. }
  77. //--------------------------------------------------------------------------
  78. // 功能:set the index of the first visible line int the text control wnd
  79. //--------------------------------------------------------------------------
  80. int KWndText::SetTopLine(int nTopLine)
  81. {
  82. if (nTopLine >= 0 && nTopLine < m_nLineCount)
  83. m_nTopLine = nTopLine;
  84. return 0;
  85. }
  86. //--------------------------------------------------------------------------
  87. // 功能:设置文本缓冲区指针
  88. //--------------------------------------------------------------------------
  89. void KWndText::SetTextPtr(char* pText, int nMaxLen)
  90. {
  91. m_pText = pText;
  92. m_nBuffLen = nMaxLen;
  93. m_nTextLen = 0;
  94. m_nTopLine = 0;
  95. m_nLineCount = 0;
  96. }
  97. void KWndText::Clone(KWndText* pCopy)
  98. {
  99. if (pCopy)
  100. {
  101. KWndWindow::Clone(pCopy);
  102. pCopy->m_nFontSize = m_nFontSize;
  103. pCopy->m_TextColor = m_TextColor;
  104. pCopy->m_BorderColor = m_BorderColor;
  105. }
  106. }
  107. //--------------------------------------------------------------------------
  108. // 功能:初始化
  109. //--------------------------------------------------------------------------
  110. int KWndText::Init(KIniFile* pIniFile, const char* pSection)
  111. {
  112. if (KWndWindow::Init(pIniFile, pSection))
  113. {
  114. pIniFile->GetInteger(pSection, "Font", 12, &m_nFontSize);
  115. //====读取文字对齐方式====
  116. m_Style &= ~WNDTEXT_ES_ALIGN_FILTER;
  117. int nValue;
  118. pIniFile->GetInteger(pSection, "HAlign", 0, &nValue);
  119. if (nValue == 1)
  120. m_Style |= WNDTEXT_ES_HALIGN_CENTRE;
  121. else if (nValue == 2)
  122. m_Style |= WNDTEXT_ES_HALIGN_RIGHT;
  123. pIniFile->GetInteger(pSection, "VAlign", 0, &nValue);
  124. if (nValue == 1)
  125. m_Style |= WNDTEXT_ES_VALIGN_CENTRE;
  126. else if (nValue == 2)
  127. m_Style |= WNDTEXT_ES_VALIGN_BOTTOM;
  128. //===读取文字====
  129. char Buff[256];
  130. pIniFile->GetString(pSection, "Color", "0,0,0", Buff, 16);
  131. m_TextColor = GetColor(Buff);
  132. pIniFile->GetString(pSection, "BorderColor", "0,0,0", Buff, 16);
  133. m_BorderColor = GetColor(Buff);
  134. if (m_pText && m_pText[0] == 0)
  135. {
  136. if (pIniFile->GetString(pSection, "Text", "", Buff, 256))
  137. {
  138. strncpy(m_pText, Buff, m_nBuffLen - 1);
  139. m_pText[m_nBuffLen - 1] = 0;
  140. m_nTextLen = strlen(m_pText);
  141. }
  142. }
  143. pIniFile->GetInteger(pSection, "MultiLine", 0, &nValue);
  144. if (nValue)
  145. {
  146. m_Style |= WNDTEXT_ES_MULTILINE;
  147. if (g_pRepresentShell)
  148. {
  149. int nLineLen;
  150. m_nLineCount = TGetEncodedTextLineCount(
  151. m_pText, m_nTextLen, (m_Width * 2) / m_nFontSize, nLineLen, m_nFontSize);
  152. }
  153. else
  154. m_nLineCount = 0;
  155. if (m_nTopLine >= m_nLineCount)
  156. m_nTopLine = 0;
  157. }
  158. else
  159. {
  160. m_Style &= ~ WNDTEXT_ES_MULTILINE;
  161. m_nLineCount = 0;
  162. m_nTopLine = 0;
  163. }
  164. return true;
  165. }
  166. return false;
  167. }
  168. //--------------------------------------------------------------------------
  169. // 功能:绘制窗口
  170. //--------------------------------------------------------------------------
  171. void KWndText::PaintWindow()
  172. {
  173. KWndWindow::PaintWindow();
  174. if (m_pText == NULL || m_pText[0] == 0 || g_pRepresentShell == NULL)
  175. return;
  176. KOutputTextParam Param;
  177. Param.nX = m_nAbsoluteLeft;
  178. Param.nY = m_nAbsoluteTop;
  179. Param.nZ = TEXT_IN_SINGLE_PLANE_COORD;
  180. if ((m_Style & WNDTEXT_ES_MULTILINE) == 0)
  181. {
  182. switch(m_Style & WNDTEXT_ES_HALIGN_FILTER)
  183. {
  184. case WNDTEXT_ES_HALIGN_CENTRE:// 居中
  185. Param.nX += (m_Width - m_nTextLen * m_nFontSize / 2) / 2;
  186. if (Param.nX < m_nAbsoluteLeft)
  187. Param.nX = m_nAbsoluteLeft;
  188. break;
  189. case WNDTEXT_ES_HALIGN_RIGHT:// 居右
  190. Param.nX += m_Width - m_nTextLen * m_nFontSize / 2;
  191. if (Param.nX < m_nAbsoluteLeft)
  192. Param.nX = m_nAbsoluteLeft;
  193. break;
  194. }
  195. switch(m_Style & WNDTEXT_ES_VALIGN_FILTER)
  196. {
  197. case WNDTEXT_ES_VALIGN_CENTRE:
  198. Param.nY += (m_Height - m_nFontSize - 1) / 2;
  199. break;
  200. case WNDTEXT_ES_VALIGN_BOTTOM:
  201. Param.nY += m_Height - m_nFontSize - 1;
  202. break;
  203. }
  204. Param.nNumLine = 1;
  205. }
  206. else //多行
  207. Param.nNumLine = m_Height / (m_nFontSize + 1);
  208. Param.nSkipLine = m_nTopLine;
  209. Param.Color = m_TextColor;
  210. Param.BorderColor = m_BorderColor;
  211. g_pRepresentShell->OutputRichText(m_nFontSize, &Param, m_pText, m_nTextLen, m_Width);
  212. }
  213. //--------------------------------------------------------------------------
  214. // 功能:设置文本文字颜色
  215. //--------------------------------------------------------------------------
  216. void KWndText::SetTextColor(unsigned int Color)
  217. {
  218. m_TextColor = Color;
  219. }
  220. //--------------------------------------------------------------------------
  221. // 功能:设置数值文字
  222. //--------------------------------------------------------------------------
  223. void KWndText::SetIntText(int nNumber, char Separator)
  224. {
  225. char Buff[16];
  226. int nLen;
  227. if (m_pText)
  228. {
  229. if (Separator)
  230. nLen = sprintf(Buff, "%d%c", nNumber, Separator);
  231. else
  232. nLen = sprintf(Buff, "%d", nNumber);
  233. SetText(Buff, nLen);
  234. }
  235. }
  236. //--------------------------------------------------------------------------
  237. // 功能:设置数值文字
  238. //--------------------------------------------------------------------------
  239. void KWndText::Set2IntText(int nNumber1, int nNumber2, char Separator)
  240. {
  241. char Buff[32];
  242. int nLen;
  243. if (m_pText)
  244. {
  245. nLen = sprintf(Buff, "%d%c%d", nNumber1, Separator, nNumber2);
  246. SetText(Buff, nLen);
  247. }
  248. }
  249. //--------------------------------------------------------------------------
  250. // 功能:构造函数
  251. //--------------------------------------------------------------------------
  252. KWndText32::KWndText32()
  253. {
  254. m_Text[0] = m_Text[31] = 0;
  255. SetTextPtr(m_Text, 31);
  256. }
  257. //--------------------------------------------------------------------------
  258. // 功能:构造函数
  259. //--------------------------------------------------------------------------
  260. KWndText80::KWndText80()
  261. {
  262. m_Text[0] = m_Text[79] = 0;
  263. SetTextPtr(m_Text, 79);
  264. }
  265. //--------------------------------------------------------------------------
  266. // 功能:构造函数
  267. //--------------------------------------------------------------------------
  268. KWndText256::KWndText256()
  269. {
  270. m_Text[0] = m_Text[255] = 0;
  271. SetTextPtr(m_Text, 255);
  272. }
  273. //--------------------------------------------------------------------------
  274. // 功能:构造函数
  275. //--------------------------------------------------------------------------
  276. KWndText512::KWndText512()
  277. {
  278. m_Text[0] = m_Text[511] = 0;
  279. SetTextPtr(m_Text, 511);
  280. }