VC++ CEdit控件如何限制只允许输入数字和小数点?

VC++ CEdit控件如何限制只允许输入数字和小数点?,第1张

自己建个类CNumEdit,基类是CEdit

重载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吧


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/11255897.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-14
下一篇 2023-05-14

发表评论

登录后才能评论

评论列表(0条)

保存