C#中的编辑控件(Edit Box)
编辑控件(Edit Box)
1.概述
编辑控件(Edit Box)又称文本框,也是在程序开发过程中经常使用的控件,通常编辑控件与静态文本一起使用,用于数据的输入或输出。编辑控件提供了完整的键盘输入和编辑功能,可以输入各种文本、数值或密码,并可以进行剪切、粘贴等操作,当一个编辑控件获得焦点时,框内会出现一个闪动的插入符。
编辑控件支持单行编辑和多行编辑,由Multline属性决定。编辑框其他常用属性有:Number表示只能输入数字,Password表示键入编辑框的字符都显示掩码“*”,用于输入密码。Border用于设置控件的边框,Uppercase或Lowercase表示键入编辑框的字符全部转换成大写或小写形式,Read-Only表示只能输入数据。
当编辑框的文本被修改时,它会向其父窗口发送EN_CHANGE消息;当字符数目达到限定值时发送EN_MAXTEXT消息;当编辑框中的文本被修改且新的文本没有显示之前发送EN_UPDATE消息。
编辑控件对应的MFC中的CEdit类,这个类中常用的成员函数如表1所示。

表1 CEdit类中常用的成员函数
2.扩展的编辑控件类
编辑控件提供了属性Number,可以用它限制用户输入的文本是数值。但美中不足,Number属性被选中的编辑控件不支持小数,这无疑是数据库应用软件所不允许的。下面介绍一种扩展的编辑控件类CExpandEdit,它支持小数的输入。另外,这个控件类还支持当用户按下回车时,将焦点移动到Tab键顺序为当前控件顺序加1的控件上。
分析:
这两个问题都非常简单,当用户输入一个字符时,会产生一个KEYDOWN消息,读者需要先将这个消息截获,然后判断输入的字符是否是0~9的数字或“.”,如果不是,不让这个消息执行;如果为回车,就向系统发送Tab,这样,系统会认为是Tab,就会执行Tab键按下时的动作。
下面是这个类的原型:
class CExpandEdit : public CEdit
{
public:
CExpandEdit();
public:
void SetNumbrOnly(bool bOnly=true); //设置是否启动只输入数字(包括".")的功能
virtual ~CExpandEdit();
private:
bool m_NumberOnly; //记录是否启动功能的成员变量
};
当用使用SetNumbrOnly()函数时,将成员变量m_NumberOnly设置为True,表示用户已经启动了只输入数字(包括“.”)功能。
void CExpandEdit::SetNumbrOnly(bool bOnly)
{
m_NumberOnly=bOnly;
}
下面是此类的关键,重载虚函数PreTranslateMessage(),用它来处理发送给对话框的消息。
BOOL CExpandEdit::PreTranslateMessage(MSG* pMsg)
{
if(pMsg->message==WM_KEYDOWN)
{
if(pMsg->wParam==13)
{
pMsg->wParam=9; //"Tab"
return CEdit::PreTranslateMessage(pMsg);
}
if((pMsg->wParam<48 || pMsg->wParam>57)&&
pMsg->wParam!=190 && //"."
pMsg->wParam!=13 && //"Enter"
pMsg->wParam!=8&& //"Back Space"
m_NumberOnly==true)
//小键盘
if(pMsg->wParamwParam>VK_NUMPAD9 &&
pMsg->wParam!=110) //小键盘上的"."
pMsg->wParam=VK_CONTROL;
}
return CEdit::PreTranslateMessage(pMsg);
}
运行效果如图1所示。

图1 CExpandEdit类的使用