重载OnChar
void CNumEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
BOOL bConitue
bConitue = (nChar >= '0' &&nChar <= '9') // 数字
|| (nChar == '.'&&m_nDec >0 ) // 小数点
|| nChar == '-' // 负号
|| nChar == 8 // 退格符
|| nChar == 13 // 回车符
if(!bConitue) return// 限定输入
CString sBefore,sAfter
GetWindowText(sBefore)// 先获取文本
//保存光标位置
int nPosCurbgn, nPosCurend
GetSel(nPosCurbgn, nPosCurend)//获取选择位置
CEdit::OnChar( nChar, nRepCnt, nFlags)
GetWindowText(sAfter)// 先获取文本
int nLength = sAfter.GetLength()//获取长度
if((nLength==1)&&(nChar == 13)){
SetWindowText(_T("0"))
UpdateData(FALSE)
SetSel(0,0,true)// 还原选择
UpdateData(TRUE)
return
}
int nPos = sAfter.Find(_T("."))// 找小数点位置
//如果长度超过设置长度则返回
if(nLength >m_nLength)
{
SetWindowText(sBefore) // 还原数字
SetSel(nPosCurbgn,nPosCurend,true)// 还原选择
return
}
//如果精度超过设置的精度则返回
if(nPos != CB_ERR &&nLength - nPos -1 >m_nDec)
{
SetWindowText(sBefore) // 还原数字
SetSel(nPosCurbgn,nPosCurend,true)// 还原选择
return
}
if((nChar == '+'||nChar == '-')&&(nLength>1))
{
// if(!(sAfter.Find("+")==0|| sAfter.Find("-")==0)&&(sBefore.Find("+")==0)&&(sBefore.Find("-")==0)){
SetWindowText(sBefore) // 还原数字
SetSel(nPosCurbgn,nPosCurend,true)// 还原选择
return
//}
}
//小数点不在首位
if(nLength >0 &&sAfter.Left(1) == ".")
{
SetWindowText(sBefore) // 还原数字
SetSel(nPosCurbgn,nPosCurend,true)// 还原选择
return
}
//只有一个小数点
if(sBefore.Find(_T(".")) != CB_ERR &&nChar == 46)
{
SetWindowText(sBefore)
SetSel(nPosCurbgn,nPosCurend,true)
return
}
}
前导0可以自己判断处理,原理同上
你要实现哪些功能嘛一般来说可以通过classwizard为创建的文本框(CEdit)关联两个成员变量,一个是Value类型,一个是Control类型的
如果你不需要改变文本框的位置,那直接在resources View里的Dialog直接放置一个文本框
如果想实现文本框里有提示内容,比如“输入帐号”,可以为文本框添加SetFocus和KillFocus这两种消息类型(具体消息名我记不清了,但是在classwizard里有)
比如你为文本框添加了这两个成员变量
Value类型m_editValue
Control类型m_editCtrl
则可以在创建对话框程序的InitDialog添加
m_editValue = "输入帐号"
UpdateData(FALSE)
然后在SetFocus函数里
m_editValue.Empty()//清空
UpdateData(FALSE)//在显示上清空
在killfocus函数里
UpdateData(TRUE)//获取用户的输入,传到m_editValue里
然后要对用户的输入干嘛就可以 *** 作m_editValue了,它是CString类型的,很好 *** 作
至于m_eidtCtrl,当你要设置位置时,可以使用MoveWindow函数等,具体的还是看msdn吧
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)