当前位置:   article > 正文

MFC中封装Edit,只能输入数字,小数点和负号_mfc编辑框限制数字和小数

mfc编辑框限制数字和小数

重新封装的MFC edit控件,可以根据自己的需求继续优化封装。

转载http://blog.csdn.net/qing666888/article/details/53519768

功能介绍:

1、只能响应输入数字、负号、小数点,以及backspace键;

2、只能输入一个负号、小数点;

3、小数点不能在负号后面;

4、负号只能够在第一位输入;

5、可设置输入的长度(包括负号和小数点);

 

在项目头文件新建.h文件,命名NumberEdit.h

  1. /**************************************************************************
  2. * @Copyright (c) 2016, QGM, All rights reserved.
  3. * @file : NumberEdit.h
  4. * @author : 小光
  5. * @describe : 对edit控件进行了封装优化,只能够输入数字正负浮点数
  6. **************************************************************************/
  7. #pragma once
  8. // CNumberEdit
  9. class CNumberEdit : public CEdit
  10. {
  11. DECLARE_DYNAMIC(CNumberEdit)
  12. public:
  13. CNumberEdit();
  14. virtual ~CNumberEdit();
  15. protected:
  16. DECLARE_MESSAGE_MAP()
  17. virtual BOOL PreTranslateMessage(MSG* pMsg);
  18. /**
  19. * @describe: 用于判断当前Edit文本中是否包含某个字符
  20. * @param[in]: nChar 要检查的字符
  21. * @return: BOOL TRUE:已存在; FALSE:不存在
  22. */
  23. BOOL CheckUnique(char nChar);
  24. private:
  25. int m_countNum ; //保存输入的数字长度 不包括负号和小数点
  26. int m_precision; //限制输入的数字长度,包括-和小数点
  27. public:
  28. /**
  29. * @describe: 设置输入长度(包括负号、小数点)
  30. * @param[in]: Precision 输入长度
  31. * @return: 无
  32. */
  33. void SetPrecision(int precision);
  34. };

 

在项目源文件新建.cpp文件,命名NumberEdit.cpp 

  1. // NumberEdit.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "NumberEdit.h"
  5. // CNumberEdit
  6. IMPLEMENT_DYNAMIC(CNumberEdit, CEdit)
  7. CNumberEdit::CNumberEdit()
  8. {
  9. //默认精度可以输入6个字符,包括 - 和 .
  10. m_precision = 6;
  11. }
  12. CNumberEdit::~CNumberEdit()
  13. {
  14. }
  15. BEGIN_MESSAGE_MAP(CNumberEdit, CEdit)
  16. END_MESSAGE_MAP()
  17. // CNumberEdit message handlers
  18. BOOL CNumberEdit::PreTranslateMessage(MSG* pMsg)
  19. {
  20. // TODO: Add your specialized code here and/or call the base class
  21. CString str;
  22. int nPos = 0;
  23. if (pMsg->message == WM_KEYDOWN)
  24. {
  25. //截获 Delete按键 ,不允许用此键删除
  26. if (46 == pMsg->wParam)
  27. {
  28. return TRUE;
  29. }
  30. }
  31. if( pMsg->message == WM_CHAR )
  32. {
  33. //获取当前输入前已经输入的数字字符个数
  34. GetWindowText(str);
  35. nPos = str.GetLength();
  36. //如果小于等于0则刚开始没有字符
  37. if(nPos <= 0)
  38. {
  39. m_countNum = 0;
  40. }
  41. //获取光标上次的位置
  42. int curPosion = LOWORD(GetSel());
  43. int startChar = 0;
  44. int endChar = 0;
  45. GetSel(startChar,endChar); //获取选中的字符位置
  46. int deleteNum = endChar - startChar;
  47. //Backspace键及Delete键
  48. if((8==pMsg->wParam) || (127==pMsg->wParam))
  49. {
  50. //如果光标不在首位置,而且在字符长度大于1,则可以按backspace键
  51. if (8==pMsg->wParam && curPosion!=0 && nPos>1)
  52. {
  53. if (deleteNum!=0)
  54. {
  55. m_countNum = m_countNum - deleteNum;
  56. }
  57. else
  58. {
  59. m_countNum --;
  60. }
  61. return FALSE;
  62. }
  63. //无法在此获得delete键消息
  64. //如果光标不在最后,且按下delete键时,后面有字符可以按Delete键 ,
  65. //if (127==pMsg->wParam && curPosion!=nPos && curPosion<nPos)
  66. //{
  67. // if (deleteNum!=0)
  68. // {
  69. // m_countNum = m_countNum - deleteNum;
  70. // }
  71. // else
  72. // {
  73. // m_countNum --;
  74. // }
  75. // return FALSE;
  76. //}
  77. //其他情况直接return
  78. return FALSE;
  79. }
  80. //Enturn键
  81. if(pMsg->wParam == VK_RETURN)
  82. {
  83. GetFocus()->UpdateData(TRUE);
  84. return FALSE;//为母窗口保留处理,主要为焦点设置
  85. }
  86. //只允许输入一个小数点
  87. if((46 == pMsg->wParam) && CheckUnique(46))
  88. {
  89. return TRUE;
  90. }
  91. //当前字符是’.’ 及 当前光标在第一位及当前还没有’-’,才可以输入-
  92. if((46 == pMsg->wParam) && !CheckUnique(46))
  93. {
  94. if(curPosion == 0 || curPosion== m_precision)
  95. {
  96. return TRUE;
  97. }
  98. if(CheckUnique(45) && curPosion ==1) //小数点不允许在负号后面
  99. {
  100. return TRUE;
  101. }
  102. return CEdit::PreTranslateMessage(pMsg);; //则接受这个消息,实现输入’.’
  103. }
  104. //只允许输入一个’-’
  105. if(((45 == pMsg->wParam) && CheckUnique(45)))
  106. {
  107. return TRUE;
  108. }
  109. //当前字符是’-’ 及 当前光标在第一位及当前还没有’-’,才可以输入-
  110. if((45 == pMsg->wParam) && !CheckUnique(45))
  111. {
  112. if (curPosion!=0) //光标不在第一位则不能输入 -
  113. {
  114. return TRUE;
  115. }
  116. return CEdit::PreTranslateMessage(pMsg); //则接受这个消息,实现输入’-’
  117. }
  118. //只允许输入负号,数字,点号。其它不处理直接返回
  119. if(45 != pMsg->wParam && !(pMsg->wParam >= 48 && pMsg->wParam <= 57) && 46 != pMsg->wParam )
  120. {
  121. return TRUE;
  122. }
  123. //只能输入6个字符包括(- .)
  124. if(nPos >= m_precision)
  125. {
  126. return TRUE;
  127. }
  128. //只能连续输入多少个数字
  129. if(pMsg->wParam >= 48 && pMsg->wParam <= 57)
  130. {
  131. m_countNum ++;
  132. }
  133. }
  134. return CEdit::PreTranslateMessage(pMsg);
  135. }
  136. BOOL CNumberEdit::CheckUnique(char nChar)
  137. {
  138. CString str;
  139. int nPos = 0;
  140. GetWindowText(str);
  141. nPos = str.Find(nChar);
  142. return (nPos >=0 )?TRUE:FALSE;
  143. }
  144. void CNumberEdit::SetPrecision(int precision)
  145. {
  146. m_precision = precision;
  147. }

 

在dialog视图添加Edit Control,给ID为IDC_edit。然后添加变量CNumberEdit m_edit。然后就可以使用了

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/blog/article/detail/82971
推荐阅读
相关标签
  

闽ICP备14008679号