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

模拟服务器

开发平台:

C/C++

  1. /*****************************************************************************************
  2. // 界面窗口体系结构--输入窗口
  3. // Copyright : Kingsoft 2002
  4. // Author :   Wooy(Wu yue)
  5. // CreateTime: 2002-7-22
  6. *****************************************************************************************/
  7. #include "KWin32.h"
  8. #include "KWin32Wnd.h"
  9. #include "../../Engine/Src/KIniFile.h"
  10. #include "../Elem/WndMessage.h"
  11. #include "Wnds.h"
  12. #include "WndEdit.h"
  13. #include "KIme.h"
  14. #include "Text.h"
  15. #include "../../../Represent/iRepresent/KRepresentUnit.h"
  16. #include "../../../Represent/iRepresent/iRepresentShell.h"
  17. extern iRepresentShell* g_pRepresentShell;
  18. static KIme s_Ime;
  19. static BOOL s_LastTimeIsIme;
  20. #define MULTI_LINE (m_Flag & WNDEDIT_ES_MULTI_LINE)
  21. //寻找字符串换行的位置
  22. int SplitStringLine(char* pString, int nLine, int nLineByte);
  23. //--------------------------------------------------------------------------
  24. // 功能:构造函数
  25. //--------------------------------------------------------------------------
  26. KWndEdit::KWndEdit()
  27. {
  28. m_Flag = WNDEDIT_ES_ENGLISH_AVAILABLE;
  29. m_nBufferSize = 0;
  30. m_nLimitText = 0;
  31. m_nTextLen = 0;
  32. m_nSkipAhead    = 0;
  33. m_nSkipBehind   = 0;
  34. m_nCaretLineIndex = 0;
  35. m_nCaretPos     = 0;
  36. m_nCaretTime    = 0;
  37. m_nFontSize = 12;
  38. m_TextBorderColor = 0;
  39. m_FocusBkColor = 0;
  40.     //m_hEdit = NULL;
  41. }
  42. KWndEdit::~KWndEdit()
  43. {
  44.     //if (m_hEdit)
  45.     //{
  46.     //    DestroyWindow(m_hEdit);
  47.     //    m_hEdit = NULL;
  48.     //}
  49. }
  50. void KWndEdit::Clone(KWndEdit* pCopy)
  51. {
  52. if (pCopy)
  53. {
  54. KWndWindow::Clone(pCopy);
  55. pCopy->m_Flag = m_Flag & WNDEDIT_ES_FILTER;
  56. pCopy->m_nLimitText = m_nLimitText;
  57. pCopy->m_TextColor = m_TextColor;
  58. pCopy->m_nFontSize = m_nFontSize;
  59. pCopy->m_TextBorderColor = m_TextBorderColor;
  60. pCopy->m_FocusBkColor = m_FocusBkColor;
  61. FmtForShow();
  62. }
  63. }
  64. //--------------------------------------------------------------------------
  65. // 功能:初始化
  66. //--------------------------------------------------------------------------
  67. int KWndEdit::Init(KIniFile* pIniFile, const char* pSection)
  68. {
  69. if (KWndWindow::Init(pIniFile, pSection))
  70. {
  71. int nValue;
  72. pIniFile->GetInteger(pSection, "MultiLine", 0, &nValue);
  73. if (nValue)
  74. {
  75. m_Flag |= WNDEDIT_ES_MULTI_LINE;
  76. m_nSkipAhead = 0;
  77. }
  78. else
  79. {
  80. m_Flag &= ~WNDEDIT_ES_MULTI_LINE;
  81. m_nCaretLineIndex = 0;
  82. }
  83. pIniFile->GetInteger(pSection, "Password", 0, &nValue);
  84. if (nValue)
  85. {
  86. m_Flag |= WNDEDIT_ES_MASK_CHARACTER;
  87. m_Flag &= ~WNDEDIT_ES_MULTI_LINE;
  88. }
  89. else
  90. {
  91. m_Flag &= ~WNDEDIT_ES_MASK_CHARACTER;
  92. }
  93. m_Flag &= ~WNDEDIT_ES_CHAR_TYPE_FILTER;
  94. pIniFile->GetInteger(pSection, "Type", 0, &nValue);
  95. if (nValue == 1)
  96. m_Flag |= WNDEDIT_ES_ENGLISH_AVAILABLE;
  97. else if (nValue == 2)
  98. m_Flag |= WNDEDIT_ES_IME_AVAILABLE;
  99. //====字串限长====
  100. pIniFile->GetInteger(pSection, "MaxLen", -1, &m_nLimitText);
  101. if (m_nLimitText > m_nBufferSize - 1 || m_nLimitText == -1)
  102. m_nLimitText = m_nBufferSize -1;
  103. if (m_nLimitText < 0)
  104. m_nLimitText = 0;
  105. //if limitext value is been changed, ignore changing.
  106. //===文字颜色====
  107. char Buff[16];
  108. pIniFile->GetString(pSection, "Color", "", Buff, 16);
  109. m_TextColor = GetColor(Buff);
  110. pIniFile->GetString(pSection, "BorderColor", "", Buff, 16);
  111. m_TextBorderColor = GetColor(Buff);
  112. //====文字大小====
  113. pIniFile->GetInteger(pSection, "Font", 12, &m_nFontSize);
  114. if (m_nFontSize < 8)
  115. m_nFontSize = 12;
  116. if (m_Width < m_nFontSize)
  117. {
  118. if (m_Flag & WNDEDIT_ES_IME_AVAILABLE)
  119. m_Width = m_nFontSize;
  120. else
  121. m_Width = m_nFontSize / 2;
  122. }
  123. if (m_Height < m_nFontSize + 1)
  124. m_Height = m_nFontSize + 1;
  125. pIniFile->GetString(pSection, "FocusBKColor", "0,0,0", Buff, sizeof(Buff));
  126. m_FocusBkColor = (GetColor(Buff) & 0xffffff);
  127. if (pIniFile->GetInteger(pSection, "FocusBKColorAlpha", 128, &nValue))
  128. {
  129. if (nValue > 255 || nValue < 0)
  130. m_FocusBkColor |= 0x16000000;
  131. else
  132. m_FocusBkColor |= (((255 - nValue) << 21) & 0xff000000);
  133. }
  134.         //extern HINSTANCE    hInst;  // in S3Client.cpp
  135. //
  136.         //m_hEdit = CreateWindowEx(
  137.         //    0, "EDIT", NULL, 
  138.         //    ES_LEFT | WS_CHILD, 
  139.         //    //0, 0,
  140.         //    //100, 20,
  141.         //    m_nAbsoluteLeft, m_nAbsoluteTop,
  142.         //    m_Width, m_Height,
  143.         //    ::g_GetMainHWnd(), 
  144.         //    NULL, hInst, NULL
  145.         //);
  146.         //
  147.         //ShowWindow(m_hEdit, SW_SHOW);
  148. FmtForShow();
  149. return true;
  150. }
  151. return false;
  152. }
  153. //--------------------------------------------------------------------------
  154. // 功能:禁止或者允许窗口被操作
  155. //--------------------------------------------------------------------------
  156. void KWndEdit::Enable(int bEnable)
  157. {
  158. if (bEnable)
  159. {
  160. m_Style &= ~WND_S_DISABLE;
  161. }
  162. else
  163. {
  164. if (m_Flag & WNDEDIT_F_HAVE_FOCUS)
  165. Wnd_SetFocusWnd(NULL);
  166. m_Style |= WND_S_DISABLE;
  167. }
  168. }
  169. //--------------------------------------------------------------------------
  170. // 功能:窗口函数(处理消息)
  171. //--------------------------------------------------------------------------
  172. int KWndEdit::WndProc(unsigned int uMsg, unsigned int uParam, int nParam)
  173. {
  174. int nRet = 0;
  175. switch(uMsg)
  176. {
  177. case WM_LBUTTONDOWN:
  178. case WM_RBUTTONDOWN:
  179. if (IsVisible() && Wnd_GetFocusWnd() != (KWndWindow*)this)
  180. {
  181. Wnd_SetFocusWnd((KWndWindow*)this);
  182. }
  183. else
  184. nRet = KWndWindow::WndProc(uMsg, uParam, nParam);
  185. break;
  186. case WM_IME_CHAR:
  187. case WM_CHAR:
  188. if ((m_Flag & WNDEDIT_F_HAVE_FOCUS) && ((m_Style & WND_S_DISABLE) == 0))
  189. {
  190. if (InsertChar(uParam))
  191. UpdateData();
  192. nRet = 1;
  193. }
  194. break;
  195. case WM_KEYDOWN:
  196. if (!IsDisable())
  197. nRet = OnKeyDown(uParam, nParam);
  198. break;
  199. case WND_M_SET_FOCUS:
  200. if (m_pText)
  201. {
  202. if (m_Flag & WNDEDIT_ES_IME_AVAILABLE)
  203. {
  204. s_Ime.EnableLanguageChange();
  205. if (s_LastTimeIsIme)
  206.     s_Ime.OpenIME();
  207. }
  208. // m_nCaretPos = m_nTextLen; //把光标位置设在文本末尾
  209. m_Flag |= WNDEDIT_F_HAVE_FOCUS;
  210. m_nCaretTime = 0;
  211. // CreateCaret(::g_GetMainHWnd(), (HBITMAP)NULL, 2, m_nFontSize);
  212.             m_nCaretX = m_nAbsoluteLeft;
  213.             m_nCaretY = m_nAbsoluteTop;
  214.             SetCaretPos(m_nCaretX, m_nCaretY);
  215.             s_Ime.SetCaretPos(m_nCaretX, m_nCaretY);
  216. //          ShowCaret(::g_GetMainHWnd());
  217. }
  218. break;
  219. case WND_M_KILL_FOCUS:
  220. //        DestroyCaret();
  221. if (m_Flag & WNDEDIT_ES_IME_AVAILABLE)
  222. s_LastTimeIsIme = s_Ime.IsIme();
  223. s_Ime.DisableLanguageChange();
  224. s_Ime.CloseIME();
  225. m_Flag &= ~WNDEDIT_F_HAVE_FOCUS;
  226. break;
  227. case WM_SYSKEYDOWN:
  228. if (m_pParentWnd)
  229. nRet = m_pParentWnd->WndProc(uMsg, uParam, nParam);
  230. break;
  231. case WM_MOUSEWHEEL:
  232. if (!IsDisable())
  233. {
  234. int zDelta = short(HIWORD(uParam));
  235. if (zDelta != 0)
  236. nRet = OnKeyDown(zDelta < 0 ? VK_DOWN : VK_UP, 0);
  237. }
  238. break;
  239. default:
  240. nRet = KWndWindow::WndProc(uMsg, uParam, nParam);
  241. break;
  242. }
  243. return nRet;
  244. }
  245. void KWndEdit::SetColor(unsigned int uColor)
  246. {
  247. m_TextColor = uColor;
  248. }
  249. //--------------------------------------------------------------------------
  250. // 功能:插入字符串
  251. //--------------------------------------------------------------------------
  252. int KWndEdit::InsertString(const char* pString, int nLen)
  253. {
  254. int bInserted = false;
  255. if (pString)
  256. {
  257. int bEnableChinese = (m_Flag & WNDEDIT_ES_IME_AVAILABLE);
  258. if (nLen < 0)
  259. nLen = strlen(pString);
  260. for (int nPos = 0; nPos < nLen; nPos++)
  261. {
  262. if ((unsigned char)(pString[nPos]) <= 0x80)
  263. {
  264. if (InsertChar(pString[nPos]))
  265. bInserted = true;
  266. }
  267. else if (nPos + 1 < nLen)
  268. {
  269. if (bEnableChinese && InsertChar(pString[nPos + 1], pString[nPos]))
  270. bInserted = true;
  271. nPos ++;
  272. }
  273. }
  274. if (bInserted)
  275. FmtForShow();
  276. }
  277. return bInserted;
  278. }
  279. int KWndEdit::Paste()
  280. {
  281. int bPasted = false;
  282. if (OpenClipboard(NULL))
  283. {
  284. HANDLE hData = GetClipboardData(CF_TEXT);
  285. if (hData)
  286. bPasted = InsertString((char*)hData, -1);
  287. if (m_Flag & WNDEDIT_ES_MASK_CHARACTER)
  288. EmptyClipboard();
  289. CloseClipboard();
  290. }
  291. return bPasted;
  292. }
  293. //--------------------------------------------------------------------------
  294. // 功能:响应键盘按键操作
  295. //--------------------------------------------------------------------------
  296. int KWndEdit::OnKeyDown(int nKeyCode, int nModifiers)
  297. {
  298. int nRet = 1;
  299. switch(nKeyCode)
  300. {
  301. case VK_DELETE:
  302. if (m_nCaretPos < m_nTextLen)
  303. {
  304. int nNextPos = TSplitString(m_pText + m_nCaretPos, 1, false);
  305. m_nTextLen -= nNextPos;
  306. memmove(m_pText + m_nCaretPos, m_pText + m_nCaretPos + nNextPos, m_nTextLen - m_nCaretPos + 1);
  307. UpdateData();
  308. }
  309. break;
  310. case VK_LEFT:
  311. if (m_nCaretPos)
  312. {
  313. m_nCaretPos = TSplitString(m_pText, m_nCaretPos - 1, true);
  314. FmtForShow();
  315. }
  316. break;
  317. case VK_RIGHT:
  318. if (m_nCaretPos < m_nTextLen)
  319. {
  320. m_nCaretPos += TSplitString(m_pText + m_nCaretPos, 1, false);
  321. FmtForShow();
  322. }
  323. break;
  324. case VK_HOME:
  325. m_nCaretPos = 0;
  326. FmtForShow();
  327. break;
  328. case VK_END:
  329. m_nCaretPos = m_nTextLen;
  330. FmtForShow();
  331. break;
  332. case VK_UP:
  333. if (MULTI_LINE && m_nCaretLineIndex)
  334. {
  335. int nCharPerLine = (m_Width * 2) / m_nFontSize;
  336. int nLineHead = 0, nLineEnd = 0;
  337. for (nRet = 0; nRet < m_nCaretLineIndex; nRet++)
  338. {
  339. nLineHead = nLineEnd;
  340. nLineEnd = nLineHead + SplitStringLine(&m_pText[nLineHead], 1, nCharPerLine);
  341. }
  342. m_nCaretPos = nLineHead + TSplitString(&m_pText[nLineHead],
  343. (m_nCaretPos - nLineEnd), false);
  344. if (m_nCaretPos >= nLineEnd && nLineEnd)
  345. {
  346. m_nCaretPos = nLineEnd;
  347. if(m_pText[nLineEnd - 1] == KTC_ENTER)
  348. m_nCaretPos--;
  349. }
  350. FmtForShow();
  351. }
  352. else if (m_pParentWnd)
  353. nRet = m_pParentWnd->WndProc(WND_N_EDIT_SPECIAL_KEY_DOWN, (unsigned int)(KWndWindow*)this, VK_UP);
  354. break;
  355. case VK_DOWN:
  356. if (MULTI_LINE)
  357. {
  358. int nCharPerLine = (m_Width * 2) / m_nFontSize;
  359. int nLineHead = 0, nLineEnd = 0;
  360. for (nRet = 0; nRet <= m_nCaretLineIndex; nRet++)
  361. {
  362. nLineHead = nLineEnd;
  363. nLineEnd = nLineHead + SplitStringLine(&m_pText[nLineHead], 1, nCharPerLine);
  364. }
  365. m_nCaretPos = nLineEnd + TSplitString(&m_pText[nLineEnd],
  366. (m_nCaretPos - nLineHead), false);
  367. nLineHead = nLineEnd;
  368. nLineEnd = nLineHead + SplitStringLine(&m_pText[nLineHead], 1, nCharPerLine);
  369. if (m_nCaretPos >= nLineEnd && nLineEnd)
  370. {
  371. m_nCaretPos = nLineEnd;
  372. if(m_pText[nLineEnd - 1] == KTC_ENTER)
  373. m_nCaretPos--;
  374. }
  375. FmtForShow();
  376. }
  377. else if (m_pParentWnd)
  378. nRet = m_pParentWnd->WndProc(WND_N_EDIT_SPECIAL_KEY_DOWN, (unsigned int)(KWndWindow*)this, VK_DOWN);
  379. break;
  380. case VK_TAB:
  381. case VK_PRIOR:
  382. case VK_NEXT:
  383. case VK_ESCAPE:
  384. if (m_pParentWnd)
  385. nRet = m_pParentWnd->WndProc(WND_N_EDIT_SPECIAL_KEY_DOWN, (unsigned int)(KWndWindow*)this, nKeyCode);
  386. break;
  387. case VK_RETURN:
  388. if (m_pParentWnd)
  389. {
  390. if ((m_Flag & WNDEDIT_ES_MULTI_LINE) == 0)
  391. nRet = m_pParentWnd->WndProc(WND_N_EDIT_SPECIAL_KEY_DOWN, (unsigned int)(KWndWindow*)this, VK_RETURN);
  392. else if ((GetKeyState(VK_CONTROL) & 0x8000) == 0 && (GetKeyState(VK_SHIFT) & 0x8000) == 0)
  393. nRet = m_pParentWnd->WndProc(WND_N_EDIT_SPECIAL_KEY_DOWN, (unsigned int)(KWndWindow*)this, VK_RETURN);
  394. else if (InsertChar(0x0a, 0))
  395. {
  396. UpdateData();
  397. nRet = 1;
  398. }
  399. }
  400. break;
  401. case 'V': //粘帖
  402. if ((GetKeyState(VK_CONTROL) & 0x8000) && Paste())
  403. nRet = 1;
  404. break;
  405. case VK_SPACE:
  406. case VK_BACK:
  407. return 1;
  408. default:
  409. if ((nKeyCode < '0' || nKeyCode > '9') &&
  410. (nKeyCode < 'A' || nKeyCode > 'Z') &&
  411. (nKeyCode < VK_NUMPAD0 || nKeyCode > VK_DIVIDE))
  412. {
  413. nRet = 0;
  414. }
  415. }
  416. return nRet;
  417. }
  418. //--------------------------------------------------------------------------
  419. // 功能:插入字符操作
  420. // 返回:是否有字符串是否被摆变
  421. //--------------------------------------------------------------------------
  422. int KWndEdit::InsertChar(int nChar)
  423. {
  424. if (nChar > 0x80) //此判断与语言编码规则相关
  425. {
  426. if (m_Flag & WNDEDIT_ES_IME_AVAILABLE)
  427. return (InsertChar((char)(nChar & 0xff), (char)(nChar >> 8)));
  428. else
  429. return false;
  430. }
  431. if (nChar == VK_BACK) //退格
  432. {
  433. if (m_nCaretPos)
  434. {
  435. int nPrioPos = TSplitString(m_pText, m_nCaretPos - 1, true);
  436. memmove(m_pText + nPrioPos, m_pText + m_nCaretPos, m_nTextLen - m_nCaretPos + 1);
  437. m_nTextLen -= m_nCaretPos - nPrioPos;
  438. m_nCaretPos = nPrioPos;
  439. return true;
  440. }
  441. }
  442. else if (nChar >= ' ' && nChar <= '~')
  443. {
  444. if ((m_Flag & WNDEDIT_ES_CHAR_TYPE_FILTER) || (nChar >= '0' && nChar <= '9'))
  445. return (InsertChar((char)(nChar & 0xff), 0));
  446. }
  447. return false;
  448. }
  449. //--------------------------------------------------------------------------
  450. // 功能:在字符串里执行插入字符操作
  451. // 参数:cLow  -> 为要插入的为单字节字符;如果要插入为双字节字符,则为后一个字节。
  452. //       cHigh -> 要插入的为单字节字符时cHigh为0,如果要插入为双字节字符,则为前一个字节。
  453. // 返回:字符串是否被改变
  454. //--------------------------------------------------------------------------
  455. int KWndEdit::InsertChar(char cLow, char cHigh)
  456. {
  457. int nLen = cHigh ? 2 : 1;
  458. if (m_nCaretPos + nLen <= m_nLimitText)
  459. {
  460. if (m_nTextLen + nLen > m_nLimitText)
  461. {
  462. m_nTextLen = m_nCaretPos + TSplitString(m_pText + m_nCaretPos, m_nLimitText - nLen - m_nCaretPos, true);
  463. m_pText[m_nTextLen] = 0;
  464. }
  465. memmove(m_pText + m_nCaretPos + nLen, m_pText + m_nCaretPos, m_nTextLen - m_nCaretPos + 1);
  466. if (cHigh)
  467. m_pText[m_nCaretPos++] = cHigh;
  468. m_pText[m_nCaretPos++] = cLow;
  469. m_nTextLen += nLen;
  470. return 1;
  471. }
  472. return 0;
  473. }
  474. //--------------------------------------------------------------------------
  475. // 功能:字符串被更新
  476. //--------------------------------------------------------------------------
  477. void KWndEdit::UpdateData()
  478. {
  479. FmtForShow();
  480. if (m_pParentWnd)
  481. { //发送更新消息
  482. m_pParentWnd->WndProc(WND_N_EDIT_CHANGE, (unsigned int)(KWndWindow*)this, 0);
  483. }
  484. }
  485. //--------------------------------------------------------------------------
  486. // 功能:计算更新影响字符串显示的一些控制参数
  487. //--------------------------------------------------------------------------
  488. void KWndEdit::FmtForShow()
  489. {
  490. if (m_pText == NULL)
  491. return;
  492. int nLineLen = (m_Width * 2) / m_nFontSize;
  493. if ((m_Flag & WNDEDIT_ES_MULTI_LINE) == 0)
  494. //============================
  495. // 单行输入窗口处理
  496. //============================
  497. {
  498. int nJumpLen = 4;
  499. if (nLineLen < nJumpLen + 2)
  500. nJumpLen = 1;
  501. if (m_nCaretPos < m_nSkipAhead)
  502. m_nSkipAhead = TSplitString(m_pText, m_nCaretPos - nJumpLen, true);
  503. else if (m_nCaretPos > m_nSkipAhead + nLineLen - 1)
  504. m_nSkipAhead = TSplitString(m_pText, m_nCaretPos + nJumpLen - nLineLen, false);
  505. if (m_nSkipAhead + nLineLen >= m_nTextLen)
  506. m_nSkipBehind = -1;
  507. else
  508. m_nSkipBehind = m_nSkipAhead + TSplitString(m_pText + m_nSkipAhead, nLineLen, true);
  509. }
  510. //============================
  511. // 多行输入窗口处理
  512. //============================
  513. else
  514. {
  515. int nLine = m_Height / (m_nFontSize + 1);
  516. if (m_nCaretPos < m_nSkipAhead)
  517. {
  518. m_nSkipBehind = 0;
  519. do
  520. {
  521. m_nSkipAhead = m_nSkipBehind;
  522. m_nSkipBehind = m_nSkipAhead + SplitStringLine(m_pText + m_nSkipAhead, 1, nLineLen);
  523. }while(m_nSkipBehind < m_nCaretPos);
  524. }
  525. m_nSkipBehind = m_nSkipAhead + SplitStringLine(m_pText + m_nSkipAhead, nLine, nLineLen);
  526. while (m_nCaretPos > m_nSkipBehind)
  527. {
  528. m_nSkipAhead = m_nSkipAhead + SplitStringLine(m_pText + m_nSkipAhead, 1, nLineLen);
  529. m_nSkipBehind = m_nSkipAhead + SplitStringLine(m_pText + m_nSkipAhead, nLine, nLineLen);
  530. }
  531. m_nCaretLineIndex = 0;
  532. int nLineHead = 0, nLineEnd = 0;
  533. while(true)
  534. {
  535. nLineHead = nLineEnd;
  536. nLineEnd = nLineHead + SplitStringLine(&m_pText[nLineHead], 1, nLineLen);
  537. if (nLineEnd >= m_nCaretPos)
  538. break;
  539. m_nCaretLineIndex ++;
  540. };
  541. if (m_nCaretPos > 0 && m_pText[m_nCaretPos -1] == KTC_ENTER)
  542. {
  543. m_nCaretLineIndex ++;
  544. int nTemp = m_nSkipAhead + SplitStringLine(m_pText + m_nSkipAhead, nLine - 1, nLineLen);
  545. if (nTemp < m_nSkipBehind)
  546. {
  547. m_nSkipAhead = m_nSkipAhead + SplitStringLine(m_pText + m_nSkipAhead, 1, nLineLen);
  548. m_nSkipBehind = m_nSkipAhead + SplitStringLine(m_pText + m_nSkipAhead, nLine, nLineLen);
  549. }
  550. }
  551. }
  552. }
  553. //--------------------------------------------------------------------------
  554. // 功能:寻找字符串换行的位置
  555. //--------------------------------------------------------------------------
  556. int SplitStringLine(char* pString, int nLine, int nLineByte)
  557. {
  558. int nPos = 0;
  559. if (pString)
  560. {
  561. int nLineOffset = 0;
  562. while(pString[nPos])
  563. {
  564. if ((BYTE)pString[nPos] > 0x80)
  565. {
  566. if (pString[nPos + 1])//防止出现单BYTE的高于0x80的字符
  567. { //中文字符
  568. nLineOffset += 2;
  569. if (nLineOffset > nLineByte)
  570. {
  571. if ((--nLine) == 0)
  572. break;
  573. nLineOffset = 2;
  574. }
  575. nPos += 2;
  576. continue;
  577. }
  578. }
  579. nPos ++;
  580. if (pString[nPos - 1] == KTC_ENTER || (++nLineOffset) >= nLineByte)
  581. {
  582. if ((--nLine) == 0)
  583. break;
  584. nLineOffset = 0;
  585. }
  586. }
  587. }
  588. return nPos;
  589. }
  590. //--------------------------------------------------------------------------
  591. // 功能:窗体绘制
  592. //--------------------------------------------------------------------------
  593. void KWndEdit::PaintWindow()
  594. {
  595.     //HideCaret(::g_GetMainHWnd());
  596. KWndWindow::PaintWindow();
  597. if (m_pText == NULL)
  598.     {
  599. return;
  600.         //ShowCaret(::g_GetMainHWnd());
  601.     }
  602.     
  603. bool bShowCaret = false;
  604. if (m_Flag & WNDEDIT_F_HAVE_FOCUS)
  605. {
  606. if ( ++m_nCaretTime <= 10)
  607. bShowCaret = true;
  608. else if (m_nCaretTime >= 17)
  609. m_nCaretTime = 0;
  610. if (m_FocusBkColor && g_pRepresentShell)
  611. {
  612. KRUShadow Shadow;
  613. Shadow.oPosition.nX = m_nAbsoluteLeft;
  614. Shadow.oPosition.nY = m_nAbsoluteTop;
  615. Shadow.oEndPos.nX = m_nAbsoluteLeft + m_Width;
  616. Shadow.oEndPos.nY = m_nAbsoluteTop + m_Height;
  617. Shadow.Color.Color_dw = m_FocusBkColor;
  618. g_pRepresentShell->DrawPrimitives(1, &Shadow, RU_T_SHADOW, true);
  619. }
  620. }
  621. if (MULTI_LINE == 0)
  622. {
  623. int nLen;
  624. if (m_nSkipBehind < 0)
  625. nLen = m_nTextLen - m_nSkipAhead;
  626. else
  627. nLen = m_nSkipBehind - m_nSkipAhead;
  628. if ((m_Flag & WNDEDIT_ES_MASK_CHARACTER) == 0)
  629. {
  630. g_pRepresentShell->OutputText(m_nFontSize, &m_pText[m_nSkipAhead],  nLen,
  631. m_nAbsoluteLeft, m_nAbsoluteTop, m_TextColor, 0,
  632. TEXT_IN_SINGLE_PLANE_COORD, m_TextBorderColor);
  633. }
  634. else
  635. {
  636. int x = m_nAbsoluteLeft;
  637. for (; nLen > 1; nLen -= 2, x += m_nFontSize)
  638. g_pRepresentShell->OutputText(m_nFontSize, "**", 2, x, m_nAbsoluteTop, m_TextColor,
  639. 0, TEXT_IN_SINGLE_PLANE_COORD, m_TextBorderColor);
  640. if (nLen)
  641. g_pRepresentShell->OutputText(m_nFontSize, "*", 1, x, m_nAbsoluteTop, m_TextColor,
  642. 0, TEXT_IN_SINGLE_PLANE_COORD, m_TextBorderColor);
  643. }
  644. if (bShowCaret)
  645. {   
  646. int nCaretX = m_nAbsoluteLeft + (m_nCaretPos - m_nSkipAhead) * m_nFontSize / 2 + 2;
  647. int nCaretY = m_nAbsoluteTop;
  648.             if (
  649.                 (m_nCaretX != nCaretX) ||
  650.                 (m_nCaretY != nCaretY)
  651.             )
  652.             {
  653.                 m_nCaretX = nCaretX;
  654.                 m_nCaretY = nCaretY;
  655.                 SetCaretPos(m_nCaretX, m_nCaretY);
  656.                 s_Ime.SetCaretPos(m_nCaretX, m_nCaretY);
  657.             }
  658.             g_pRepresentShell->OutputText(m_nFontSize, "│", 2,
  659. nCaretX - m_nFontSize / 2, nCaretY, m_TextColor,
  660. 0, TEXT_IN_SINGLE_PLANE_COORD, m_TextBorderColor);
  661. }
  662. }
  663. else
  664. {
  665. int nLineBytes = (m_Width * 2) / m_nFontSize;
  666. int nLineAhead = m_nSkipAhead, nLineEnd;
  667. int y = m_nAbsoluteTop;
  668. do
  669. {
  670. nLineEnd  = nLineAhead + SplitStringLine(m_pText + nLineAhead, 1, nLineBytes);
  671. g_pRepresentShell->OutputText(m_nFontSize, m_pText + nLineAhead, nLineEnd - nLineAhead, m_nAbsoluteLeft, y,
  672. m_TextColor, m_Width, TEXT_IN_SINGLE_PLANE_COORD, m_TextBorderColor);
  673. if (bShowCaret && m_nCaretPos >= nLineAhead && m_nCaretPos <= nLineEnd)
  674. {
  675. int nCaretX, nCaretY;
  676. if (m_nCaretPos == nLineEnd && m_nCaretPos > 0 && m_pText[m_nCaretPos - 1] == KTC_ENTER)
  677. {
  678. nCaretX = m_nAbsoluteLeft - m_nFontSize / 2 + 2;
  679. nCaretY = y + m_nFontSize + 1;
  680. }
  681. else
  682. {
  683. nCaretX = m_nAbsoluteLeft + (m_nCaretPos - nLineAhead - 1) * m_nFontSize / 2 + 2;
  684. nCaretY = y;
  685. }
  686.                 if (
  687.                     (m_nCaretX != nCaretX) ||
  688.                     (m_nCaretY != nCaretY)
  689.                 )
  690.                 {
  691.                     m_nCaretX = nCaretX;
  692.                     m_nCaretY = nCaretY;
  693.                     SetCaretPos(m_nCaretX, m_nCaretY);
  694.                     s_Ime.SetCaretPos(m_nCaretX, m_nCaretY);
  695.                 }
  696. g_pRepresentShell->OutputText(m_nFontSize, "│", 2, nCaretX, nCaretY, m_TextColor,
  697. 0, TEXT_IN_SINGLE_PLANE_COORD, m_TextBorderColor);
  698. bShowCaret = false;
  699. }
  700. y += m_nFontSize + 1;
  701. nLineAhead = nLineEnd;
  702. }while(nLineEnd < m_nSkipBehind);
  703. }
  704.     //ShowCaret(::g_GetMainHWnd());
  705. }
  706. //--------------------------------------------------------------------------
  707. // 功能:设置文本缓冲区指针
  708. //--------------------------------------------------------------------------
  709. void KWndEdit::SetTextPtr(char* pText, int nMaxLen)
  710. {
  711. m_Flag  = 0;
  712. m_pText = pText;
  713. if ((m_nBufferSize = nMaxLen) <= 0)
  714. m_nBufferSize = 0;
  715. else if (m_nLimitText > m_nBufferSize - 1)
  716. m_nLimitText = m_nBufferSize - 1;
  717. }
  718. //--------------------------------------------------------------------------
  719. // 功能:设置文本文字
  720. //--------------------------------------------------------------------------
  721. void KWndEdit::SetText(const char* pText)
  722. {
  723. if (pText && m_pText)
  724. {
  725. m_nTextLen = strlen(pText);
  726. if (m_nTextLen > m_nLimitText)
  727. m_nTextLen = TSplitString(pText, m_nLimitText, true);
  728. memcpy(m_pText, pText, m_nTextLen);
  729. m_pText[m_nTextLen] = 0;
  730. m_nCaretPos = m_nTextLen;
  731. UpdateData();
  732. }
  733. }
  734. void KWndEdit::ClearText(bool bSafe)
  735. {
  736. if (m_pText)
  737. {
  738. m_nTextLen = 0;
  739. m_nCaretPos = 0;
  740. if (bSafe == false)
  741. m_pText[0] = 0;
  742. else
  743. memset(m_pText, 0, m_nBufferSize);
  744. UpdateData();
  745. }
  746. }
  747. //--------------------------------------------------------------------------
  748. // 功能:设置数值文字
  749. //--------------------------------------------------------------------------
  750. void KWndEdit::SetIntText(int nNumber)
  751. {
  752. char Buff[16];
  753. sprintf(Buff, "%d", nNumber);
  754. SetText(Buff);
  755. }
  756. int KWndEdit::GetIntNumber()
  757. {
  758. if (m_pText)
  759. return atoi(m_pText);
  760. return 0;
  761. }
  762. //--------------------------------------------------------------------------
  763. // 功能:获取字符串内容
  764. //--------------------------------------------------------------------------
  765. int KWndEdit::GetText(char* pBuffer, int nSize, bool bExcludeSpace)
  766. {
  767. int nRet = 0;
  768. if (m_pText && pBuffer)
  769. {
  770. int nSkipAhead = 0;
  771. nRet = m_nTextLen;
  772. if (bExcludeSpace)
  773. {
  774. while(nRet && m_pText[nRet - 1] == ' ')
  775. nRet --;
  776. while(nSkipAhead < nRet && m_pText[nSkipAhead] == ' ')
  777. nSkipAhead ++;
  778. }
  779. if (nRet - nSkipAhead + 1 <= nSize)
  780. {
  781. memcpy(pBuffer, &m_pText[nSkipAhead], nRet - nSkipAhead);
  782. nRet -= nSkipAhead;
  783. pBuffer[nRet] = 0;
  784. }
  785. else
  786. nRet = -1;
  787. }
  788. return nRet;
  789. }
  790. void KWndEdit::GetCaretPosition(int* nx, int* ny)
  791. {
  792. if (nx)
  793. *nx = (m_nCaretPos - m_nSkipAhead) * m_nFontSize / 2;
  794. if (ny)
  795. *ny = m_nCaretLineIndex  * m_nFontSize;
  796. }
  797. //--------------------------------------------------------------------------
  798. // 功能:构造函数
  799. //--------------------------------------------------------------------------
  800. KWndEdit32::KWndEdit32()
  801. {
  802. m_Text[0] = m_Text[31] = 0;
  803. SetTextPtr(m_Text, 32);
  804. }
  805. //--------------------------------------------------------------------------
  806. // 功能:构造函数
  807. //--------------------------------------------------------------------------
  808. KWndEdit512::KWndEdit512()
  809. {
  810. m_Text[0] = m_Text[511] = 0;
  811. SetTextPtr(m_Text, 512);
  812. }