MyNumEdit.cpp
上传用户:jzscgs158
上传日期:2022-05-25
资源大小:8709k
文件大小:8k
源码类别:

百货/超市行业

开发平台:

Visual C++

  1. #include "stdafx.h"
  2. #include "MyNumEdit.h"
  3. #include<comdef.h>
  4. #ifdef _DEBUG
  5. #define new DEBUG_NEW
  6. #undef THIS_FILE
  7. static char THIS_FILE[] = __FILE__;
  8. #endif
  9. IMPLEMENT_DYNAMIC(CMyNumEdit,CEdit)
  10. BEGIN_MESSAGE_MAP(CMyNumEdit, CEdit)
  11. //{{AFX_MSG_MAP(CMyNumEdit)
  12. ON_WM_CHAR()
  13. ON_WM_KEYDOWN()
  14. ON_WM_KILLFOCUS()
  15. //}}AFX_MSG_MAP
  16. ON_MESSAGE(WM_CUT, OnCut)
  17. ON_MESSAGE(WM_PASTE, OnPaste)
  18. ON_MESSAGE(WM_CLEAR, OnClear)
  19. END_MESSAGE_MAP()
  20. CMyNumEdit::CMyNumEdit()
  21. {
  22. m_intLeft=10;
  23. m_intRight=0;
  24. m_Point=-1;
  25. blnAuto=FALSE;
  26. }
  27. CMyNumEdit::~CMyNumEdit()
  28. {
  29. }
  30. /////////////////////////////////////////////////////////////////////////////
  31. // CMyNumEdit message handlers
  32. void CMyNumEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) 
  33. {
  34. CString strValue;
  35. int i,j;
  36. GetSel(i,j);
  37. GetWindowText(strValue);
  38. m_Point=strValue.Find('.');
  39. int m=strValue.Find('.');
  40. if(strValue.GetLength()==1&&strValue.GetAt(0)=='0')
  41. {
  42. if(nChar>'0'&&nChar<='9')
  43. {
  44. strValue.SetAt(0,nChar);
  45. SetWindowText(strValue);
  46. SetSel(1,1);
  47. return;
  48. }
  49. }
  50. if(i<=m&&m>=m_intLeft&&nChar!=8)
  51. {
  52. MessageBeep((UINT)-1);
  53. return;
  54. }
  55. if(i==0 && nChar=='0' && m_intRight==0) 
  56. {
  57. MessageBeep((UINT)-1);
  58. return;
  59. }
  60. else if(i==0&&nChar=='.'&&m_intRight!=0)
  61. {
  62. MessageBeep((UINT)-1);
  63. return;
  64. }
  65. else if(i==1 &&m_intRight!=0)
  66. {
  67. if(m_Point<0 && strValue.GetAt(0)=='0')
  68. {
  69. if(nChar>'0'&&nChar<='9')
  70. {
  71. strValue.SetAt(0,nChar);
  72. SetWindowText(strValue);
  73. SetSel(1,1);
  74. return;
  75. }
  76. else if(nChar=='0')
  77. {
  78. MessageBeep((UINT)-1);
  79. return;
  80. }
  81. }
  82. else if(m_Point>=0&&nChar=='.')
  83. {
  84. MessageBeep((UINT)-1);
  85. return;
  86. }
  87. }
  88. GetWindowText(strValue);
  89. if(nChar!=8)
  90. {
  91. if(m_intRight==0)
  92. {
  93. if(strValue.GetLength()<m_intLeft)
  94. {
  95. if(!isdigit(nChar))
  96. {
  97. MessageBeep((UINT)-1);
  98. return;
  99. }
  100. }
  101. else
  102. {
  103. MessageBeep((UINT)-1);
  104. return;
  105. }
  106. }
  107. else
  108. {
  109. if(m_Point<0)
  110. {
  111. if(i<m_intLeft)
  112. {
  113. if(nChar=='.') m_Point=i;
  114. if(!isdigit(nChar) && nChar!='.')
  115. {
  116. MessageBeep((UINT)-1);
  117. return;
  118. }
  119. }
  120. else if(i>m_intLeft)
  121. {
  122. MessageBeep((UINT)-1);
  123. return;
  124. }
  125. else
  126. {
  127. if(nChar=='.')
  128. m_Point=i;
  129. else
  130. {
  131. MessageBeep((UINT)-1);
  132. return;
  133. }
  134. }
  135. }
  136. else if(m_Point>=0)
  137. {
  138. if(nChar=='.')
  139. {
  140. MessageBeep((UINT)-1);
  141. return;
  142. }
  143. GetSel(i,j);
  144. m=strValue.Find('.');
  145. if(i>m)
  146. {
  147. if(strValue.GetLength()-m_Point-1>=m_intRight)
  148. {
  149. MessageBeep((UINT)-1);
  150. return;
  151. }
  152. }
  153. else
  154. {
  155. if(m>m_intLeft)
  156. {
  157. MessageBeep((UINT)-1);
  158. return;
  159. }
  160. }
  161. if(!isdigit(nChar) && nChar!='.')
  162. {
  163. MessageBeep((UINT)-1);
  164. return;
  165. }
  166. }
  167. }
  168. }
  169. else 
  170. {
  171. int i,j;
  172. GetSel(i,j);
  173. i=i-1; 
  174. GetWindowText(strValue);
  175. if(i>=0 && strValue.GetAt(i)=='.') 
  176. {
  177. m_Point=-1;
  178. if(strValue.GetLength()>=m_intLeft)
  179. {
  180. strValue=strValue.Left(i+1);
  181. SetWindowText(strValue);
  182. SetSel(strValue.GetLength(),strValue.GetLength());
  183. }
  184. }
  185. }
  186. CEdit::OnChar(nChar, nRepCnt, nFlags);
  187. }
  188. void CMyNumEdit::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
  189. {
  190. CEdit::OnKeyDown(nChar, nRepCnt, nFlags);
  191. }
  192. BOOL CMyNumEdit::CheckFloat(char nchar,int StartPos,int EndPos)
  193. {
  194. return TRUE;
  195. }
  196. BOOL CMyNumEdit::CheckInt(char nchar,int StartPos,int EndPos)
  197. {
  198. return TRUE;
  199. }
  200. LONG CMyNumEdit::OnCut(UINT, LONG)
  201. {
  202. return 0;
  203. }
  204. // Clears the current selection.
  205. LONG CMyNumEdit::OnClear(UINT wParam, LONG lParam)
  206. {
  207. return 0;
  208. CMyNumEdit::OnClear(wParam,lParam);
  209. }
  210. // Pastes the text from the clipboard onto the current selection.
  211. LONG CMyNumEdit::OnPaste(UINT, LONG)
  212. {
  213. return 0;
  214. }
  215. void CMyNumEdit::SetNumType(int intLeft,int intRight)
  216. {
  217. m_intLeft=intLeft;
  218. m_intRight=intRight;
  219. }
  220. CString CMyNumEdit::GetText()
  221. {
  222. GetWindowText(m_strText);
  223. SetText(m_strText);
  224. return m_strText;
  225. }
  226. void CMyNumEdit::SetText(CString strText)
  227. {
  228. CString strValue;
  229. strText.TrimLeft();
  230. strText.TrimRight();
  231. int i,j;
  232. if(strText=="") strText="0";
  233. if(!isdigit(strText.GetAt(0))) strText="0";
  234. if(m_intRight==0)
  235. {
  236. i=strText.Find('.');
  237. if(i>0) strText=strText.Left(i);
  238. if(strText.GetLength()>=m_intLeft)
  239. {
  240. strValue=strText.Left(m_intLeft);
  241. for(i=0;i<m_intLeft;i++)
  242. {
  243. if(!isdigit(strValue.GetAt(i)))
  244. strValue.SetAt(i,'0');
  245. }
  246. }
  247. else
  248. {
  249. strValue=strText;
  250. for(i=0;i<strValue.GetLength();i++)
  251. {
  252. if(!isdigit(strValue.GetAt(i)))
  253. strValue.SetAt(i,'0');
  254. }
  255. }
  256. for(i=0;i<=strValue.GetLength();i++)
  257. {
  258. if((strValue.GetAt(0)=='0'||(!isdigit(strValue.GetAt(0)))))
  259. {
  260. strValue=strValue.Right(strValue.GetLength()-1);
  261. i=0;
  262. }
  263. }
  264. strValue.TrimLeft();
  265. strValue.TrimRight();
  266. if(strValue=="") strValue="0";
  267. }
  268. else
  269. {
  270. i=strText.Find('.');
  271. if(i>m_intLeft)
  272. {
  273. strValue=strText.Left(m_intLeft);
  274. for(i=0;i<m_intLeft;i++)
  275. {
  276. if(!isdigit(strValue.GetAt(i)))
  277. strValue.SetAt(i,'0');
  278. }
  279. for(i=0;i<=strValue.GetLength();i++)
  280. {
  281. if((strValue.GetAt(0)=='0'||(!isdigit(strValue.GetAt(0)))))
  282. {
  283. strValue=strValue.Right(strValue.GetLength()-1);
  284. i=0;
  285. }
  286. }
  287. strValue.TrimLeft();
  288. strValue.TrimRight();
  289. if(strValue=="") strValue="0";
  290. strValue=strValue+".";
  291. for (i=m_intRight;i>0;i--)
  292. {
  293. strValue=strValue+"0";
  294. }
  295. }
  296. else if(i>=0 && i<=m_intLeft)
  297. {
  298. strValue=strText.Left(i);
  299. for(j=0;j<i;j++)
  300. {
  301. if(!isdigit(strValue.GetAt(j)))
  302. strValue.SetAt(j,0);
  303. }
  304. for(i=0;i<=strValue.GetLength();i++)
  305. {
  306. if((strValue.GetAt(0)=='0'||(!isdigit(strValue.GetAt(0)))))
  307. {
  308. strValue=strValue.Right(strValue.GetLength()-1);
  309. i=0;
  310. }
  311. }
  312. strValue.TrimLeft();
  313. strValue.TrimRight();
  314. if(strValue=="") strValue="0";
  315. strValue=strValue+".";
  316. i=strText.Find('.');
  317. for(j=i+1;j<i+m_intRight+1;j++)
  318. {
  319. if(j<strText.GetLength()&&isdigit(strText.GetAt(j)))
  320. strValue=strValue+strText.Mid(j,1);
  321. else
  322. strValue=strValue+"0";
  323. }
  324. }
  325. if(i<0)
  326. {
  327. if(strText.GetLength()<=m_intLeft) 
  328. {
  329. strValue=strText;
  330. for(i=0;i<=strValue.GetLength();i++)
  331. {
  332. if((strValue.GetAt(0)=='0'||(!isdigit(strValue.GetAt(0)))))
  333. {
  334. strValue=strValue.Right(strValue.GetLength()-1);
  335. i=0;
  336. }
  337. }
  338. strValue.TrimLeft();
  339. strValue.TrimRight();
  340. if(strValue=="") strValue="0";
  341. strValue=strValue+".";
  342. for(j=m_intRight;j>0;j--)
  343. {
  344. strValue=strValue+"0";
  345. }
  346. }
  347. else
  348. {
  349. strValue=strText.Left(m_intLeft);
  350. for(i=0;i<=strValue.GetLength();i++)
  351. {
  352. if((strValue.GetAt(0)=='0'||(!isdigit(strValue.GetAt(0)))))
  353. {
  354. strValue=strValue.Right(strValue.GetLength()-1);
  355. i=0;
  356. }
  357. }
  358. strValue.TrimLeft();
  359. strValue.TrimRight();
  360. if(strValue=="") strValue="0";
  361. strValue=strValue+".";
  362. for(j=m_intRight;j>0;j--)
  363. {
  364. strValue=strValue+"0";
  365. }
  366. }
  367. }
  368. CString strMy=strValue.Left(strValue.GetLength());
  369. i=strMy.Find('.');
  370. if(i<=0)
  371. {
  372. strMy.TrimLeft();
  373. strMy.TrimRight();
  374. if(strMy=="") strMy="0";
  375. strMy.Format("%s.",strMy);
  376. for(j=m_intRight;j>0;j--)
  377. {
  378. strMy.Format("%s0",strMy);
  379. }
  380. strValue=strMy;
  381. }
  382. for(i=0;i<strValue.GetLength();i++)
  383. {
  384. if(!isdigit(strValue.GetAt(i))&&strValue.GetAt(i)!='.')
  385. strValue.SetAt(i,'0');
  386. }
  387. }
  388. if(blnAuto)
  389. {
  390. CString str;
  391. i=strValue.Find('.');
  392. if(i<m_intLeft&&i>0)
  393. {
  394. for(;i<m_intLeft;i++)
  395. {
  396. strValue="0"+strValue;
  397. }
  398. }
  399. else if(i==-1&&m_intRight==0)
  400. {
  401. i=strValue.GetLength();
  402. for(;i<m_intLeft;i++)
  403. {
  404. strValue="0"+strValue;
  405. }
  406. }
  407. }
  408. m_Point=strValue.Find('.');
  409. m_strText=strValue;
  410. SetWindowText(m_strText);
  411. }
  412. void CMyNumEdit::OnKillFocus(CWnd* pNewWnd)
  413. {
  414. GetWindowText(m_strText);
  415. SetText(m_strText);
  416. CEdit::OnKillFocus(pNewWnd);
  417. }