主页 > 原创 | 整理 | 学习笔记 > MFC封装输入框CEdit只允许数字、负号、点号输入

MFC封装输入框CEdit只允许数字、负号、点号输入

MFC的CEdit设置Number后只能输入纯数字,不能满足小数的输入,本文介绍一种封装CEdit实现数字、负号、点号的输入,且只能有一个点号,一个负号且只能在第一位。

1.原理
继承父类的OnChar函数,在函数中处理字符串。
2.实现
NumEdit.h文件

#pragma once

#include "DlgMessage.h"

#define INFTY 2147483647

class CNumEdit :
 public CEdit
{
public:
  CNumEdit(void);
 ~CNumEdit(void);

public:
 afx_msg void OnChar(UINT nChar, UINT nRepCnt, UINT nFlags);
 void setRange(double min, double max);

protected:
  DECLARE_MESSAGE_MAP()

private:
 double maxValue;
  double minValue;
};

NumEdit.cpp

#include "StdAfx.h"
#include "NumEdit.h"

BEGIN_MESSAGE_MAP(CNumEdit, CEdit)
  ON_WM_CHAR()
  ON_WM_CREATE()
END_MESSAGE_MAP()

CNumEdit::CNumEdit(void)
{
  maxValue = INFTY;
 minValue = -INFTY;
}


CNumEdit::~CNumEdit(void)
{
}
void CNumEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
 CString str;
  GetWindowText(str);

 int nSource,nDestination;
 GetSel(nSource,nDestination);

 // 保证小数点最多只能出现一次
  if(nChar=='.')
  {
   //若原来的字符串中已经有一个小数点,则不将小数点输入,保证了最多只能输入一个小数点
    if(str.Find('.')!=-1)
   {
   }
   // 否则就输入这个小数点
   else
    {
     CEdit::OnChar(nChar, nRepCnt, nFlags);
   }
 }
 // 保证负号只能出现一次,并且只能出现在第一个字符
  else if(nChar=='-')
 {
   // 还没有输入任何字符串
   if(str.IsEmpty())
   {
     CEdit::OnChar(nChar, nRepCnt, nFlags);
   }
   else
    {
     // 此时选择了全部的内容
     if(nSource==0&&nDestination==str.GetLength() || nSource==0&&nDestination==0&&str.Left(1).Compare(L"-"))
     {
       CEdit::OnChar(nChar, nRepCnt, nFlags);
     }
     else
      {
     }
    }  
 }
 // 除了小数点和负号,还允许输入数字,Backspace,Delete
  else if((nChar>='0' && nChar<='9')||(nChar==0x08)||(nChar==0x10))
 {
   //如果是第一个字符处输入,且已有'-'则不输入
    if (nSource==0&&nDestination==0&&!str.IsEmpty()&&str.Find('-')!=-1)
   {
   }
   else
    {
     CEdit::OnChar(nChar, nRepCnt, nFlags);
   }
   
  }
 // 其它的键,都不响应
  else
  {
 }

 GetWindowText(str);
 if (_ttof(str)>maxValue)
  {
   CString msg;
    msg.Format(L"输入的数值不能大于 %0.1f", maxValue);
   CDlgMessage(L"参数错误", msg).DoModal();
    SetWindowText(L"");
 }
 else if (_ttof(str)<minValue)
 {
   CString msg;
    msg.Format(L"输入的数值不能小于 %0.1f", minValue);
   CDlgMessage(L"参数错误", msg).DoModal();
    SetWindowText(L"");
 }
}

void CNumEdit::setRange( double min, double max )
{
  maxValue = max;
 minValue = min;
}

Tags: CEdit MFC 数字

发表评论

邮箱地址不会被公开。 必填项已用*标注