EditCtrl.cpp
上传用户:maxiaolivb
上传日期:2022-06-07
资源大小:915k
文件大小:4k
源码类别:

游戏引擎

开发平台:

Visual C++

  1. #include ".editctrl.h"
  2. EditCtrl::EditCtrl(int nId, float fPosX, float fPosY, float fWidth, float fHeight, DWORD dwTextColor, DWORD dwFrameColor)
  3. {
  4. id = nId;
  5. bStatic = false;
  6. bVisible = true;
  7. bEnabled = true;
  8. rect.Set(fPosX, fPosY, fPosX + fWidth, fPosY + fHeight);
  9. m_nCurPos = 0;
  10. m_fTime = 0;
  11. m_bFocus = false;
  12. m_bBlink = false;
  13. m_bComposition = false;
  14. m_dwTextColor = dwTextColor;
  15. m_dwFrameColor = dwFrameColor;
  16. strcpy(m_szText,"");
  17. ClearCharArray();
  18. }
  19. EditCtrl::~EditCtrl(void)
  20. {
  21. ClearCharArray();
  22. }
  23. // 清除字符池
  24. void EditCtrl::ClearCharArray()
  25. {
  26. size_t size = m_pCharArray.size();
  27. for (size_t i=0;i<size;i++)
  28. {
  29. if (m_pCharArray[i])
  30. delete m_pCharArray[i];
  31. }
  32. m_pCharArray.clear();
  33. }
  34. void EditCtrl::Render()
  35. {
  36. hge->Gfx_RenderLine(rect.x1-1, rect.y1-1, rect.x2+1, rect.y1-1, m_dwFrameColor);
  37. hge->Gfx_RenderLine(rect.x2+1, rect.y1-1, rect.x2+1, rect.y2+1, m_dwFrameColor);
  38. hge->Gfx_RenderLine(rect.x2+1, rect.y2+1, rect.x1-1, rect.y2+1, m_dwFrameColor);
  39. hge->Gfx_RenderLine(rect.x1-1, rect.y2+1, rect.x1-1, rect.y1-1, m_dwFrameColor);
  40. DWORD dwLastColor = g_pFontCN->GetColor();
  41. g_pFontCN->SetColor(m_dwTextColor);
  42. g_pFontCN->Render(rect.x1, rect.y1 + 2, m_szText);
  43. g_pFontCN->SetColor(dwLastColor);
  44. if (m_bFocus && m_bBlink)
  45. RedrawCursor();
  46. }
  47. void EditCtrl::Update(float dt)
  48. {
  49. if (m_bFocus)
  50. {
  51. m_fTime += dt;
  52. if (m_fTime > 0.3)
  53. {
  54. m_fTime = 0;
  55. m_bBlink = !m_bBlink;
  56. }
  57. }
  58. }
  59. void EditCtrl::Focus(bool bFocused)
  60. {
  61. m_bFocus = bFocused;
  62. }
  63. bool EditCtrl::KeyClick(int key, int chr)
  64. {
  65. if ( m_bFocus && !IsComposition())
  66. {
  67. int size = (int)m_pCharArray.size();
  68. switch (key)
  69. {
  70. case HGEK_ENTER:
  71. case HGEK_TAB:
  72. break;
  73. case HGEK_HOME:
  74. m_nCurPos = 0;
  75. break;
  76. case HGEK_END:
  77. m_nCurPos = size;
  78. break;
  79. case HGEK_LEFT:
  80. if (m_nCurPos > 0)
  81. m_nCurPos--;
  82. break;
  83. case HGEK_RIGHT:
  84. if (m_nCurPos < size)
  85. m_nCurPos++;
  86. break;
  87. case HGEK_DELETE:
  88. DelChar(m_nCurPos);
  89. break;
  90. case HGEK_BACKSPACE:
  91. if (m_nCurPos == 0)
  92. break;
  93. DelChar(--m_nCurPos);
  94. break;
  95. default:
  96. {
  97. if (chr == 0 || IsComposition())
  98. break;
  99. AddChar(chr,m_nCurPos++);
  100. UpdataString();
  101. }
  102. break;
  103. };
  104. m_bBlink = true; 
  105. m_fTime = 0;
  106. }
  107. return false;
  108. }
  109. // 开始组字状态
  110. void EditCtrl::StartComposition()
  111. {
  112. m_bComposition = true;
  113. }
  114. // 结束组字状态
  115. void EditCtrl::EndComposition()
  116. {
  117. m_bComposition = false;
  118. UpdataString();
  119. };
  120. void EditCtrl::OnImeCharMsg(const char *szImeChar)
  121. {
  122. if (m_bFocus)
  123.         AddCharEx(szImeChar,m_nCurPos++);
  124. }
  125. // 添加一个新的IME字符
  126. bool EditCtrl::AddCharEx(const char *szNewChar,int nPos)
  127. {
  128. st_Char *_pChar = new st_Char;
  129. if (!_pChar)
  130. return false;
  131. if (strlen(szNewChar)>2 || strlen(szNewChar)==0)
  132. return false;
  133. _pChar->bIME = (strlen(szNewChar)==1)?false:true;
  134. strcpy(_pChar->szChar,szNewChar);
  135. if (nPos < 0) //追加
  136. {
  137. m_pCharArray.push_back(_pChar);
  138. }
  139. else //根据指定位置插入
  140. {
  141. size_t size = m_pCharArray.size();
  142. if (nPos > (int)size) //末尾
  143. AddCharEx(szNewChar);
  144. else
  145. {
  146. vector <st_Char *>::iterator it;
  147. it = &m_pCharArray[nPos];
  148. m_pCharArray.insert(it,_pChar);
  149. }
  150. }
  151. return true;
  152. }
  153. // 添加一个普通的字符,将普通字符转为IME字符
  154. bool EditCtrl::AddChar(const char szNewChar,int nPos)
  155. {
  156. char szBuf[3];
  157. szBuf[0] = szNewChar;
  158. szBuf[1] = '';
  159. return AddCharEx(szBuf,nPos);
  160. }
  161. // 删除一个指定位置的字符
  162. bool EditCtrl::DelChar(int nPos)
  163. {
  164. size_t size = m_pCharArray.size();
  165. if (nPos < (int)size && nPos >= 0)
  166. {
  167. if (m_pCharArray[nPos])
  168. {
  169. m_pCharArray.erase(&m_pCharArray[nPos]);
  170. UpdataString();
  171. return true;
  172. }
  173. }
  174. return false;
  175. }
  176. // 重绘光标
  177. void EditCtrl::RedrawCursor()
  178. {
  179. if (IsComposition())
  180. return;
  181. size_t size = m_pCharArray.size();
  182. if (size >= 0)
  183. {
  184. int nCurPos = 0;
  185. for (int i = 0;i < m_nCurPos;i++)
  186. {
  187. st_Char *_pChar = m_pCharArray[i];
  188. nCurPos += (_pChar->bIME?12:ASCII_WIDTH);
  189. }
  190. hge->Gfx_RenderLine(rect.x1 + nCurPos, rect.y1 + 1, rect.x1 + nCurPos, rect.y2 - 1, m_dwTextColor);
  191. }
  192. }
  193. // 刷新字符串数据
  194. void EditCtrl::UpdataString()
  195. {
  196. size_t size = m_pCharArray.size();
  197. strcpy(m_szText,"");
  198. if (size >= 0)
  199. {
  200. for (size_t i = 0;i < size;i++)
  201. {
  202. st_Char *_pChar = m_pCharArray[i];
  203. if (_pChar)
  204. strcat(m_szText,_pChar->szChar);
  205. }
  206. }
  207. }