MFC封装输入框CEdit只允许数字、负号、点号输入
2014 年 4 月 24 日 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;
};
#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;
}
#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 数字
发表评论