限制下拉框(Combox)只允许数字
在进行Windows程序开发时,遇到下拉框既可以选择又可以输入的要求,且输入只允许输入数字,不能出现数字以为的字符。
功能的具体实现方法如下,仅供参考。
详细思路入如下
1,添加编辑框CEdit或可输入的Combobox的EditChange事件
2,GetDlgItemInt获取用户输入值中的数值
3,GetWindowTextW获取用户输入的字符串
4,只允许用户输入数字,
字符串长度大于(用户输入数值字符串)的长度
说明,当前用户输入值 组合为 数字+(字母/汉字/空格/特殊字符)(无论数字后面的跟字符有多长)
此时,将用户输入数值设置为编辑框当前值
设置光标移动至最后
单个 字母/汉字/空格/特殊字符 输入时GetDlgItemInt均小于等于
此时设置值为编辑框值为NULL
5,大于最大取值范围时设置为最大值,小于最小值取值范围时,设置为NULL
则最小最大值之外的值不会显示
方法1:利用GetDlgItemInt()
提取字符串中的数字
void CHBExSignatureCommonDlg::OnCbnEditchangeComboSignatureAutologofftime(){// TODO: 在此添加控件通知处理程序代码CString strTmp1=_T("");m_Combox.GetWindowTextW(strTmp1);int number = GetDlgItemInt(IDC_COMBOX);CString strTmp=_T("");strTmp.Format(_T("%d"),number);if (strTmp1.GetLength()>strTmp.GetLength())//{m_Combox.SetWindowTextW(strTmp);m_Combox.SetFocus();m_Combox.SetEditSel(strTmp.GetLength(),strTmp.GetLength());}if (0>=number){m_Combox.SetWindowTextW(_T(""));m_Combox.SetFocus();}if(10000<=number){m_Combox.SetWindowTextW(_T("10000"));m_Combox.SetFocus();m_Combox.SetEditSel(strTmp.GetLength(),strTmp.GetLength());}}
方法2:自己编写从字符串中提取数字的函数(该方法与编成者使用的编程语言和框架无关)
由于MFC中的GetDlgItemInt()函数提取字符串时,会自动截取字符串中的数字
例如:12344±56 ,其结果为:1234
1234+/56 , 其结果为:1234
因此GetDlgItemInt()限制输入字符时不够完美
所以需要我们自己编写从字符串中提取数字的函数
例如:1234234@%56 ,其结果应为:123423456
123456 ,其结果应为:123456
123-/#¥%456,其结果应为:123456
void CMFCDlgTestDlg::OnCbnEditchangePwdCombox(){// TODO: 在此添加控件通知处理程序代码CString strInput,strNoChar;m_Combox.GetWindowTextW(strInput);strNoChar = DeleteCharFormCstring(strInput);m_Combox.SetWindowTextW(strNoChar);//调整光标位置m_Combox.SetFocus();m_Combox.SetEditSel(strNoChar.GetLength(), strNoChar.GetLength());}//利用二分法从字符串中删除字符CString CMFCDlgTestDlg::DeleteCharFormCstring(CString sourceStr){int strLIndex = 0;int strRIndex = sourceStr.GetLength();CString strRTemp,strLTemp,strR, strL,strNUll;strR = _T("");strL = _T("");strNUll = _T("");//结束条件if (0 != strRIndex){while (strLIndex<strRIndex){wchar_t temp = sourceStr.GetAt(strLIndex);if ('0' > temp || '9' < temp){//找到特殊字符串,分割strLTemp = sourceStr.Left(strLIndex); //左字符串strL = DeleteCharFormCstring(strLTemp);strRTemp = sourceStr.Right(sourceStr.GetLength() - strLIndex - 1); //右字符串strR = DeleteCharFormCstring(strRTemp); break;}strLIndex++;}if (strLIndex == strRIndex) //找完了{//全为数字strL = sourceStr;}return strL + strR;}//空字符串return strNUll;}