在进行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
1234**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;
}