首页 > 编程语言 >VC++ 编辑框只输入数字

VC++ 编辑框只输入数字

时间:2023-05-08 15:32:44浏览次数:36  
标签:return caretPt nFlags C++ str 编辑框 OnChar 输入 nChar


void CNewEdit::OnChar(UINT nChar, UINTnRepCnt, UINT nFlags) 如下;

其它需要可以灵活定制。


void CNewEdit::OnChar(UINT nChar, UINTnRepCnt, UINT nFlags)
 {
  if(nChar==VK_BACK)//BackSpace
   CEdit::OnChar(nChar, nRepCnt,nFlags);
    //
  //Some invariable parameter for further use
  CPoint caretPt;
  caretPt=GetCaretPos ();
  caretPt.x = LOWORD (CharFromPos (caretPt));//Thefunction is the core,I'm blind to seek it for 3 daysCString str;
  int nLength;
  int nDot;
  int neE;
  double fabstr;
  GetWindowText (str);
  fabstr=fabs(atof(str));
    nLength=str.GetLength();
  nDot=str.Find(_T('.'));
  neE=max(str.Find('e'),str.Find('E'));
  
  
  
  //
  //Input 0-9,especialy 0 needs moreattention.if (isdigit(nChar))
  {
   if(nChar>'0') 
   CEdit::OnChar(nChar, nRepCnt,nFlags); else//make use of '0'
   {
    if(str.IsEmpty())
    {
     CEdit::OnChar(nChar,nRepCnt, nFlags);
     return;
    }
    
    if(str[0]=='0')
    {
       if(neE==-1)
     { 
      if(caretPt.x>1)
      {
       CEdit::OnChar(nChar,nRepCnt, nFlags);
       return;
      }
      else
       return;
     }
     else
      {
      
        if((caretPt.x-1)!=neE&& caretPt.x>1)
        {
         CEdit::OnChar(nChar,nRepCnt, nFlags);
         return;
        }
        else
         return;
       }
        
        }
     
    
    if(str[0]=='-')
     {
      if(str[1]=='0')
      {
       if(neE==-1)
       { 
        if(caretPt.x>2)
        {
         CEdit::OnChar(nChar,nRepCnt, nFlags);
         return;     
        }
       else
        return;
       }
       else
       {
        if((caretPt.x-1)!=neE&& caretPt.x>2)
        {
         CEdit::OnChar(nChar,nRepCnt, nFlags);
         return;
        }
        else
         return; 
       }
           }
   
     
     }
    
    if(str[0]>='1'&& caretPt.x>0)
    {  
     
     CEdit::OnChar(nChar,nRepCnt, nFlags);     return;
    }  
   
     }
  }
   
  
  
  
  else
   
   //
   //Determine the '-'
   if (nChar == '-')
   {
    if(!caretPt.x)
    {
     if(((nLength > 0) && (str[0]!='-')) || (nLength==0))
      CEdit::OnChar(nChar,nRepCnt, nFlags);
    }
   else
   {
    if ((str[caretPt.x-1] == 'e') || (str [caretPt.x-1] == 'E'))
     CEdit::OnChar(nChar,nRepCnt, nFlags);
   }
  }else
  
   
   //Input'e' or 'E'
   
   if ((nChar == 'e') || (nChar =='E'))
   {
    if((caretPt.x == 1) && (str[0] == '-'))
     return; if(caretPt.x)
   {
     if(neE!=-1)
      return;
    if(nDot!=-1&& caretPt.x<nDot)
     return;  CEdit::OnChar(nChar,nRepCnt, nFlags);
   }
  }else
   //
   //Input '.'
   if (nChar == '.')
   {
    if(nDot!=-1)
     return;
   
    if(neE!=-1&& caretPt.x>neE)
     return;
   CEdit::OnChar(nChar,nRepCnt, nFlags);
  }

此外如果要截取输入字符串末尾的‘0';可以利用消息WM_KILLFOCUS;

函数代码如下:

void CNewEdit::OnKillfocus()
 {
  // TODO: Add your control notification handlercode here
  CString str,tr;
  GetWindowText(str);
  int nLength;
     intnDot=-1;
  int neE;
  //double fstr;
  nLength=str.GetLength();
  
  
  
  for(int i=0;i<nLength;i++)
  {
   if(str[i]==_T('.'))
     nDot=i;
  }
  
  neE=max(str.Find(_T('e')),str.Find(_T('E')));
  
  
    
  if(nDot!=-1 && neE==-1)
   str.TrimRight(_T("0"));
  {
    int t= str.Find('.');
   
   
    if(t==str.GetLength()-1) 
    str+='0';
  }  SetWindowText(str);
 }



标签:return,caretPt,nFlags,C++,str,编辑框,OnChar,输入,nChar
From: https://blog.51cto.com/u_130277/6254539

相关文章

  • Linux下用五笔输入法
    windows下用习惯了五笔输入法,现在用Linux拼音就不是太习惯了,于是还是想用五笔,这不到网上一找,已经有人解决了次问题,方法如下:本人使用的是redhat9.0按如下方法也能使用,OK! 今天我在我的机上(rh7.3)上装上了五笔输入法,不敢独享供大家参考:智能陈桥1.0:http://download.linuxe......
  • C++和Python && 和||运算符之不同点
    ......
  • C/C++数据结构练习题[2023-05-08]
    C/C++数据结构练习题[2023-05-08]基本习题部分1字符串距离目的:字符串是一种基础且广泛使用的数据结构,与字符串相关的题目既可以考察基本程序设计能力和技巧,也可以考查算法设计能力。题目:求字符串之间距离要求:设有字符串X,称在X的头尾及中间插入任意多个空格后构成的新字......
  • C/C++二叉树应用[2023-05-08]
    C/C++二叉树应用[2023-05-08]湖南应用技术学院实验(训)报告课程名称 数据结构与算法 课程代码 221031203 成绩评定 学院 信息工程学院 专业 物联网工程 指导老师 聂作财学生姓名 xxxx 学号 xxxxx 班级 物联xxxx实验地点 实验日期 年月日小组成员 无实验类型 □验......
  • C++ | 类继承
    1.概述C++有3种继承方式:公有继承(public)、保护继承(protected)、私有继承(private)。一个B类继承于A类,或称从类A派生类B。这样的话,类A称为基类(父类),类B称为派生类(子类)。派生类中的成员,包含两部分:一部分是从基类继承过来的,另一类是派生类自己增加的成员。派生类继承基类,派生类拥有基......
  • vue+element输入框校验输入汉字再输入数字看似正常,实则有大问题,保存时数据不对
    在vue+elementUI项目中经常会使用到输入框限制为整数或者小数的需求,一般采用如下oninput="value=value.replace(/[^0-9.]/g,'')"解决,<el-input    :placeholder="请输入整数或者小数"    v-model="inputValue"   oninput="value=value.replace(/[^0-9......
  • fastadmin弹出输入框
     {name:'click',title:__('点击执行事件'),text:'一键发放',classname:'btnbtn-xsbt......
  • C++面向对象
    面向对象三大特性封装:将具体的实现过程和数据封装成一个函数,只能通过接口访问,降低耦合性继承:子类继承父类的特征和行为,子类有父类非private方法或成员变量,子类可以对父类的方法进行重写,增强了类之间的耦合性,但是当父类中的成员变量、成员函数或者类本身被 final 关键字修饰时,......
  • Ubuntu sudo不用输入密码的方法
    在启动时进入安全模式,这时是用root登录的,执行:chmod740/etc/sudoers然后打开/etc/sudoers这个文件,把最后一行:#UserprivilegespecificationrootALL=(ALL:ALL)ALL#Allowmembersofgroupsudotoexecuteanycommand%sudoALL=(ALL:ALL)ALL改为 #Use......
  • C++虚函数详解:多态性实现原理及其在面向对象编程中的应用
    在面向对象的编程中,多态性是一个非常重要的概念。多态性意味着在不同的上下文中使用同一对象时,可以产生不同的行为。C++是一种面向对象的编程语言,在C++中,虚函数是实现多态性的关键什么是虚函数虚函数是一个在基类中声明的函数,它可以被子类重写并提供不同的实现。在C++中,使用关......