您的位置:知蚁博客 » 程序设计 » 通过派生CEdit类实现在VC的edit控件里输入小数

通过派生CEdit类实现在VC的edit控件里输入小数

作者: 发布时间:2011-04-23 分类:程序设计 标签: 4,841人浏览

  在VC中经常会用到输入小数的情况,但是VC自带的Edit控件又不支持输入小数,水母在前面的博文《在VC的edit控件里输入小数的方法》中也介绍过在Edit控件中输入小数的办法,但是每加一个Dialog就要处理一下,很麻烦,于是就决定自己重新写一个CEdit类,一劳永逸的解决这个问题,以后需要输入小数的时候,直接用这个类就可以了。

  其实也不是完全写,我们只要从CEdit类派生出一个我们自己的CEdit类就可以了,首先新建一个MFC基于对话框的工程,然后打开MFC类向导(快捷键:Ctrl+W),然后【Add class…】->【New…】,就会弹出新建类的对话框了,水母的设置如下图所示:

  这样我们就从CEdit类派生出我们自己的Edit类CMyEdit类了,下面的工作就是要将这个CMyEdit类打造成我们想要的类,也就是让CMyEdit类实现在Edit控件中只能输入小数的功能。

  核心原理还是在这里:《在VC的edit控件里输入小数的方法》,其实就是控制CEdit类接受的字符,小数的组成部分包括数字0-9、小数点以及负号,此外还需要一个退格功能,这些字符消息是可接受的消息,其他字符一概干掉。此外还有个问题就是小数点和负号的判定,这两个都只能有一个,此外负号只能在最前面。知道需要做什么了,下面就开始工作,虽然需要做的操作比较多,但是也没那么麻烦,两个函数几十行代码即可搞定,具体实现在CMyEdit类的PreTranslateMessage函数中完成。

C++语言: 知蚁博客 程序设计
BOOL CMyEdit::PreTranslateMessage(MSG* pMsg)
{
if( pMsg->message == WM_CHAR )
{
//只允许输入一个小数点
if((pMsg->wParam == ‘.’) && CheckUnique(‘.’))
{
return TRUE;
}

//当前字符是’-’ && 当前光标在第一位 && 当前还没有’-’
if((pMsg->wParam == ‘-’) && (LOWORD(GetSel())==0) && !CheckUnique(‘-’))
{
return CEdit::PreTranslateMessage(pMsg); //则接受这个消息,实现输入’-’
}

//当前光标在第一位 && 当前已经有’-’
if((LOWORD(GetSel())==0) && CheckUnique(‘-’))
{
return TRUE; //不允许在’-'前面再插入任何字符,否则会出现“12-23.467”这样的情况
}

//只允许输入’.’ && 数字 ’0′ 到 ’9′  && 退格
if(pMsg->wParam!=‘.’ && (pMsg->wParam>’9′ || pMsg->wParam<’0′) && pMsg->wParam!=‘\b’)
{
return TRUE; //剩下的消息全部不处理
}
}

return CEdit::PreTranslateMessage(pMsg); //能活着到这里的消息没几个了
}

/*
* Fuction: 用于判断当前Edit文本中是否包含某个字符
* Param: char nChar 要检查的字符
* return: TRUE-已存在要检查的字符 FALSE-不存在
*/
BOOL CMyEdit::CheckUnique(char nChar)
{
CString str;
int nPos = 0;
GetWindowText(str);
nPos = str.Find(nChar);
return (nPos>=0)?TRUE:FALSE;
}

  上面代码中已经很明确了,我就不多做解释了,下面说说用法。使用的时候和平时一样,在资源中添加Edit控件,我们只需要在通过类向导添加变量的时候选择CMyEdit类即可,请看下图:

  在Edit控件中输入小数的基本功能,CMyEdit已经全部实现,但是还有些细节需要进行调整,例如格式、有效位数控制等功能还没有实现,等全部功能实现了,水母再在本文中提供下载地址,如果有朋友觉得这些功能就够了,也可以在评论中留言,水母会将源码通过邮件方法发送给各位。

  程序中有什么不足之处,也请各位能够指正!
原创文章请注明转载于知蚁博客,本文地址:http://www.letuknowit.com/archives/60

相关文章

我来说说

(必须)

(必须,保密)

你确定你已经看过文章了?
取消

无觅相关文章插件,快速提升流量