GuiEdit.cpp
上传用户:wlkj888
上传日期:2022-08-01
资源大小:806k
文件大小:12k
源码类别:

对话框与窗口

开发平台:

Visual C++

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