GuiEdit.cpp
上传用户:zhanglf88
上传日期:2013-11-19
资源大小:6036k
文件大小:11k
源码类别:

金融证券系统

开发平台:

Visual C++

  1. /////////////////////////////////////////////////////////////////////////
  2. //
  3. // Class :  GuiEdit.cpp 
  4. //
  5. // Version : 1.0
  6. //
  7. // Created : Jan 14, 2001        
  8. //
  9. // Last Modified: 
  10. //
  11. //
  12. // Copyright (C) 2001 by Francisco Campos. All rights reserved.
  13. //
  14. // This code is free for personal and commercial use, providing this 
  15. // notice remains intact in the source files and all eventual changes are
  16. // clearly marked with comments.
  17. //
  18. // No warrantee of any kind, express or implied, is included with this
  19. // software; use at your own risk, responsibility for damages (if any) to
  20. // anyone resulting from the use of this software rests entirely with the
  21. // user.
  22. //
  23. // Send bug reports, bug fixes, enhancements, requests, flames, etc. to
  24. // fcampos@tutopia.com.
  25. //
  26. // GuiEdit.cpp : implementation file
  27. //
  28. #include "stdafx.h"
  29. #include "GuiEdit.h"
  30. #include "GuiDrawLayer.h"
  31. #ifdef _DEBUG
  32. #define new DEBUG_NEW
  33. #undef THIS_FILE
  34. static char THIS_FILE[] = __FILE__;
  35. #endif
  36. /////////////////////////////////////////////////////////////////////////////
  37. // CGuiEdit
  38. CGuiEdit::CGuiEdit()
  39. {
  40. m_szMask=_T("");
  41. m_szShowMask=_T("");
  42. StrToUse=_T("()-,.@#AaXx/:\"); //caracteres para armar la mascara
  43. m_cadResult=_T("");
  44. m_enMask=MASK_FREEMASK;
  45. m_KeySpecial=0;
  46. }
  47. CGuiEdit::~CGuiEdit()
  48. {
  49. }
  50. BEGIN_MESSAGE_MAP(CGuiEdit, CEdit)
  51. //{{AFX_MSG_MAP(CGuiEdit)
  52. ON_WM_CREATE()
  53. ON_WM_PAINT()
  54. ON_WM_SYSCOLORCHANGE()
  55. ON_WM_NCPAINT()
  56. ON_WM_SIZE()
  57. ON_WM_NCCALCSIZE()
  58. ON_WM_CHAR()
  59. ON_WM_KEYDOWN()
  60. //}}AFX_MSG_MAP
  61. END_MESSAGE_MAP()
  62. /////////////////////////////////////////////////////////////////////////////
  63. // CGuiEdit message handlers
  64. void CGuiEdit::PreSubclassWindow() 
  65. {
  66. CEdit::PreSubclassWindow();
  67. }
  68. int CGuiEdit::OnCreate(LPCREATESTRUCT lpCreateStruct) 
  69. {
  70. if (CEdit::OnCreate(lpCreateStruct) == -1)
  71. return -1;
  72. m_tooltipCtrl.Create(this,TTS_ALWAYSTIP);
  73. m_tooltipCtrl.Activate(TRUE);
  74. m_tooltipCtrl.BringWindowToTop();
  75. return 0;
  76. }
  77. void CGuiEdit::OnPaint() 
  78. {
  79. CClientDC dc(this);
  80.     Default();
  81. RecalLayout();
  82. }
  83. void CGuiEdit::OnSysColorChange() 
  84. {
  85. CEdit::OnSysColorChange();
  86. }
  87.  
  88. void CGuiEdit::OnNcCalcSize(BOOL bCalcValidRects, NCCALCSIZE_PARAMS FAR* lpncsp) 
  89. {
  90. // TODO: Add your message handler code here and/or call default
  91. if (m_bnt.GetSafeHwnd()) 
  92. {
  93. CSize msz= m_bnt.GetSizeButton();
  94. lpncsp->rgrc[0].right -= msz.cx;
  95. }
  96. CEdit::OnNcCalcSize(bCalcValidRects, lpncsp);
  97. }
  98. BOOL CGuiEdit::AddButton(HICON hIcon,UINT nID,CMenu* m_menu,CString mToolTip)
  99. {
  100. if (!m_bnt.Create(_T(""), WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON | BS_OWNERDRAW, 
  101. CRect(0,0,0,0), this, nID))
  102. return FALSE;
  103. m_bnt.SetImage(hIcon);
  104. m_bnt.SetToolTip(mToolTip);
  105. m_bnt.SetStyleBorder(CGuiButton::STYLE_SEMIFLAT);
  106. m_bnt.SetMenu(m_menu);
  107. RecalLayout();
  108. return TRUE;
  109. }
  110. void CGuiEdit::RecalLayout()
  111. {
  112. CRect rc;
  113. GetClientRect(rc);
  114. if (!m_bnt.GetSafeHwnd()) return;
  115. CSize msz= m_bnt.GetSizeButton();
  116. rc.left=rc.right-msz.cx+1;
  117. m_bnt.MoveWindow(&rc);
  118. }
  119. void CGuiEdit::SetToolTip(LPCTSTR lpMsg)
  120. {
  121. CRect rc;
  122. LPCTSTR m_lpMsg=lpMsg;
  123. if (GetSafeHwnd ()== NULL) return;
  124. if (m_lpMsg != NULL)
  125. {
  126. if (m_tooltipCtrl.GetSafeHwnd () == NULL) 
  127. {
  128. m_tooltipCtrl.Create(this,TTS_ALWAYSTIP);
  129. m_tooltipCtrl.Activate(TRUE);
  130. m_tooltipCtrl.AddTool(this,lpMsg);
  131. }
  132. else
  133. {
  134. m_tooltipCtrl.UpdateTipText(lpMsg,this);
  135. }
  136. }
  137. else
  138. {
  139. if (m_tooltipCtrl.GetSafeHwnd () == NULL) 
  140. {
  141. m_tooltipCtrl.Create(this,TTS_ALWAYSTIP);
  142. m_tooltipCtrl.AddTool(this,lpMsg);
  143. }
  144. else
  145. m_tooltipCtrl.UpdateTipText(lpMsg,this);
  146. m_tooltipCtrl.Activate(FALSE);
  147. }
  148. }
  149. void CGuiEdit::OnNcPaint() 
  150. {
  151. CRect rcWindow;
  152. CRect rcClient;
  153. CWindowDC dc(this);
  154. GetWindowRect(&rcWindow);
  155. GetClientRect(&rcClient);
  156. CBrush cbr;
  157. cbr.CreateSolidBrush(GuiDrawLayer::GetRGBColorFace());
  158. rcClient.OffsetRect(-rcWindow.TopLeft());
  159.     rcWindow.OffsetRect(-rcWindow.TopLeft());
  160.     ScreenToClient(rcWindow);
  161. rcClient.OffsetRect(-rcWindow.left,-rcWindow.top);
  162. dc.ExcludeClipRect(rcClient);   
  163. rcWindow.OffsetRect(-rcWindow.left, -rcWindow.top);
  164. int ibotton=rcWindow.bottom;
  165. rcWindow.top=rcWindow.bottom;
  166. dc.FillRect(rcWindow,&cbr); 
  167. rcWindow.top=0;
  168. dc.FillRect(rcWindow,&cbr); 
  169. dc.Draw3dRect(rcWindow,GuiDrawLayer::GetRGBColorFace(),GuiDrawLayer::GetRGBColorFace()); 
  170. rcWindow.DeflateRect(1,1);
  171. dc.Draw3dRect(rcWindow,GuiDrawLayer::GetRGBCaptionXP(),GuiDrawLayer::GetRGBCaptionXP()); 
  172. }
  173. void CGuiEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) 
  174. {
  175. // TODO: Add your message handler code here and/or call default
  176. if (!m_szMask.IsEmpty())
  177. {
  178. ValidMask(nChar);
  179. if (nChar == 8) return;
  180. switch(m_enMask)
  181. {
  182. case MASK_HOUR12:
  183. // EvalHour(nChar,12);
  184. break;
  185. case MASK_HOUR24:
  186. // EvalHour(nChar,24);
  187. break;
  188. case MASK_HOURFREE:
  189. // EvalHour(nChar);
  190. break;
  191. case MASK_IPADDRESS:
  192. break;
  193. case MASK_DATEDDMMYYYY:
  194. break;
  195. case  MASK_DATEMMDDYYYY:
  196. break;
  197. case MASK_DATEYYYYDDMM:
  198. break;
  199. case MASK_DATEYYYYMMDD:
  200. break;
  201. case MASK_FREEMASK:
  202. break;
  203. }
  204. return;
  205. }
  206. CEdit::OnChar(nChar, nRepCnt, nFlags);
  207. }
  208. void CGuiEdit::DeleteString(int nStartPos,int  nEndPos )
  209. {
  210. for (int i=nStartPos; i <= nEndPos; i++)
  211. m_szShowMask.SetAt(i,m_cadResult.GetAt(i));
  212. int nNext = GetNextPos(nStartPos);
  213. SetWindowText(m_szShowMask);
  214. if (nNext > 0)
  215. SetSel(nNext-1,nNext-1);
  216. m_KeySpecial=0;
  217. }
  218. void CGuiEdit::AjustaCadena(int nStartPos,int  nEndPos )
  219. {
  220. int numCharMove=0;
  221. int LastChar=FindLasCharR(); //el ultimo caracter valido de la cadena
  222. int LastCharDel=LastChar;
  223. int init =nStartPos;
  224. for (int i=nStartPos; i <= LastChar; i++)
  225. {
  226. int nNext = GetNextPos(nStartPos);
  227. if (IsValidChar(m_szShowMask.GetAt(i),nNext) || m_szShowMask.GetAt(i)==m_cadResult.GetAt(i))//el caracter se puede mover a esa posicion
  228. {
  229. //se mueve el caracter
  230. m_szShowMask.SetAt(nStartPos,m_szShowMask.GetAt(nNext));
  231. //se reemplaza la ultima posicion despues del ultimo caracter con el
  232. //equivalente en la mascara
  233. //obtenemos la proxima posicion donde se moveria el proximo caracter
  234. nStartPos = GetNextPos(nStartPos);
  235. numCharMove++;
  236. }
  237. }
  238. DeleteString(LastCharDel,LastCharDel);
  239. SetSel(init,init);
  240. m_KeySpecial=0;
  241. }
  242. int CGuiEdit::FindLasCharR()
  243. {
  244. for (int i=m_szShowMask.GetLength()-1;i> -1; i--)
  245. {
  246. if (m_szShowMask.GetAt(i) ==' ' || IsPosMask(i))
  247. continue;
  248. else
  249. return i;
  250. }
  251. return i;
  252. }
  253. int CGuiEdit::NumCharNoMask()
  254. {
  255. int numEfect=0;
  256. for (int i;m_cadResult.GetLength()-1; i++)
  257. if (!IsPosMask(m_cadResult.GetAt(i)))
  258. numEfect++;
  259. return numEfect;
  260. }
  261. //1 -- DEL
  262. //2 -- BACK
  263. void CGuiEdit::ValidMask(UINT nChar)
  264. {
  265. int nStartPos;
  266. int ntempStartpos;
  267. int nEndPos;
  268. int nNext;
  269. GetSel( nStartPos, nEndPos ); 
  270. ntempStartpos=nStartPos;
  271. if (nStartPos != nEndPos)
  272. if (m_KeySpecial == 1)
  273. {
  274. DeleteString(nStartPos,nEndPos-1);
  275. return;
  276. }
  277. if (ntempStartpos > m_cadResult.GetLength()-1)
  278. ntempStartpos=m_cadResult.GetLength()-1;
  279. if (!IsValidChar(nChar,ntempStartpos) && m_KeySpecial ==0 || 
  280.              nChar == 32 || nChar == 8) 
  281. {
  282. if (m_KeySpecial == 1)
  283. {
  284. //si esta un caracter no valido de la mascara
  285. //emita un pito y ubique el proximo valido.
  286. if (IsPosMask(ntempStartpos))
  287. {
  288. Beep(500,1);
  289. nNext = GetNextPos(ntempStartpos);
  290. SetSel(nNext,nNext);
  291. m_KeySpecial=0;
  292. return;
  293. }
  294. else
  295. {
  296. AjustaCadena(nStartPos,nEndPos );
  297. m_KeySpecial=0;
  298. }
  299. /*m_szShowMask.SetAt(ntempStartpos,m_cadResult.GetAt(ntempStartpos));
  300. nNext = GetNextPos(ntempStartpos);
  301. SetWindowText(m_szShowMask);
  302. SetSel(nNext,nNext);
  303. m_KeySpecial=0;*/
  304. }
  305. else if(m_KeySpecial == 0)
  306. {
  307. //primero verificar que no sea un caracter de la mascara por 
  308. //ejemplo ( - etc..
  309. nNext = GetNextPos(ntempStartpos);
  310. if (IsValidChar(nChar,nNext))
  311. {
  312. m_szShowMask.SetAt(nNext,nChar);
  313. nNext = GetNextPos(nNext);
  314. SetWindowText(m_szShowMask);
  315. SetSel(nNext,nNext);
  316. }
  317. else //el caracter se desconoce
  318. SetSel(ntempStartpos,ntempStartpos);
  319. }
  320. else
  321. {  //si es back se debe encontrar la proxima posici髇 y 
  322.    //eliminar dicho espacio
  323. nNext = GetNextPos(nStartPos);
  324. m_szShowMask.SetAt(nNext,m_cadResult.GetAt(nNext));
  325. SetWindowText(m_szShowMask);
  326. SetSel(nNext,nNext);
  327. m_KeySpecial=0;
  328. }
  329. }
  330. else
  331. {
  332. //entrada de datos normal
  333. m_szShowMask.SetAt(ntempStartpos,nChar);
  334. nNext = GetNextPos(ntempStartpos);
  335. SetWindowText(m_szShowMask);
  336. SetSel(nNext, nNext);
  337. if (ntempStartpos==m_szMask.GetLength()-1)
  338. SetSel(nNext+1, nNext+1);
  339. }
  340. }
  341. BOOL CGuiEdit::IsPosMask(int nStartPos)
  342. {
  343. TCHAR Char =m_szMask.GetAt(nStartPos);
  344. if (Char == '#' || Char == '0')
  345. return FALSE;
  346. else if (Char == 'A' || Char == 'a')
  347. return FALSE;
  348. return TRUE;
  349. }
  350. BOOL CGuiEdit::IsValidChar(UINT nChar,int nStartPos)
  351. {
  352. TCHAR Char =m_szMask.GetAt(nStartPos);
  353. if (Char == '#' || Char == '0')
  354. {
  355. if( !isdigit( nChar ))
  356. return FALSE;
  357. }
  358. else if (Char == 'A' || Char == 'a')
  359. {
  360. if( !isalpha( nChar ))
  361. return FALSE;
  362. }
  363. else
  364. return FALSE;
  365. return TRUE;
  366. }
  367. int CGuiEdit::GetNextPos(int start)
  368. {
  369. if (m_KeySpecial == 2)
  370. {
  371. for (int i= start-1; i>-1;i--)
  372. {
  373. if (m_szMask.GetAt(i) == '#' || 
  374. m_szMask.GetAt(i) == '0' ||
  375. m_szMask.GetAt(i) == 'A' ||
  376. m_szMask.GetAt(i) == 'a' 
  377. )
  378. return i;
  379. }
  380. }
  381. for (int i= start+1; i< m_szMask.GetLength();i++)
  382. {
  383. TCHAR m=m_szMask.GetAt(i);
  384. if (m_szMask.GetAt(i) == '#' || 
  385. m_szMask.GetAt(i) == '0' ||
  386. m_szMask.GetAt(i) == 'A' ||
  387. m_szMask.GetAt(i) == 'a' 
  388. )
  389. return i;
  390. }
  391. return start;
  392. }
  393. void CGuiEdit::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
  394. {
  395. // TODO: Add your message handler code here and/or call default
  396. if (!m_szMask.IsEmpty())
  397. {
  398. if (nChar == VK_DELETE) 
  399. {
  400. m_KeySpecial=1;
  401. AfxCallWndProc(this, m_hWnd, WM_CHAR, ' ', 1);
  402. return;
  403. }
  404. if (nChar == VK_BACK) 
  405. {
  406. m_KeySpecial=2;
  407. return;
  408. }
  409. if(nChar == VK_RIGHT)
  410. {
  411. int nStartPos, nEndPos;
  412. GetSel( nStartPos, nEndPos ); 
  413. m_KeySpecial=3;
  414. if (!ValSpecialKey(nStartPos,nEndPos))
  415. SetSel(nStartPos,nStartPos);
  416. else
  417. {
  418. int nNext = GetNextPos(nStartPos);
  419. SetSel(nNext,nNext);
  420. }
  421. return;
  422. }
  423. }
  424. CEdit::OnKeyDown(nChar, nRepCnt, nFlags);
  425. }
  426. BOOL  CGuiEdit::ValSpecialKey(int nStartPos, int nEndPos)
  427. {
  428. int nNext=nStartPos;
  429. TCHAR Char =m_szMask.GetAt(nStartPos);
  430. if (m_KeySpecial == 3)
  431. {
  432. nNext = GetNextPos(nStartPos);
  433. if (m_szShowMask.GetAt(nNext) == m_cadResult.GetAt(nNext))
  434. {
  435. m_KeySpecial=0;
  436. return FALSE;
  437. }
  438. }
  439. m_KeySpecial=0;
  440. return TRUE;
  441. }
  442. void CGuiEdit::SetMask(CString mszMask,CString mszShowMask,Mask enTypeMask)
  443. {
  444. m_szMask=mszMask;
  445. m_szShowMask=mszShowMask;
  446. m_enMask=enTypeMask;
  447. m_cadResult=mszShowMask;
  448. SetWindowText(m_szShowMask);
  449. SetLimitText( m_szMask.GetLength()+1);
  450. int nNext = GetNextPos(0);
  451. SetSel(nNext, nNext);
  452. }
  453. BOOL CGuiEdit::PreTranslateMessage(MSG* pMsg) 
  454. {
  455. // TODO: Add your specialized code here and/or call the base class
  456. if (pMsg->lParam == WM_MOUSEMOVE)
  457. m_tooltipCtrl.RelayEvent(pMsg);
  458. return CEdit::PreTranslateMessage(pMsg);
  459. }
  460. void CGuiEdit::OnSize(UINT nType, int cx, int cy) 
  461. {
  462. CEdit::OnSize(nType, cx, cy);
  463. RecalLayout();
  464. // TODO: Add your message handler code here
  465. }