限制下拉框(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()限制输入字符时不够完美
所以需要我们自己编写从字符串中提取数字的函数
例如: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;
} 
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Aly_D

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值