限制下拉框(Combox)只允许数字

时间:2025-04-04 19:33:34

在进行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()限制输入字符时不够完美
所以需要我们自己编写从字符串中提取数字的函数
例如:1234
234@%56 ,其结果应为:123423456
1
2
3
4**56 ,其结果应为: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;
}