当前位置:   article > 正文

MFC控件edit封装,只能输入数字、负号、小数点_mfc中,怎么设置edit只能输入数字和小数点

mfc中,怎么设置edit只能输入数字和小数点

修改属性、或者只简单过滤字符串不怎么好用,重新封装的MFC edit控件,可以根据自己的需求继续优化封装。具体看代码:

功能介绍:

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

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

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

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

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


NumberEdit.h 

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


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. }



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

闽ICP备14008679号