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

金融证券系统

开发平台:

Visual C++

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