编程论坛's Archiver

ereal 发表于 2008-6-26 01:58

新手MFC编程请教文本框输入的问题

请问如何限制文本框输入的内容呢?
只能输入数字,并且限定小数点后位数

MQKt 发表于 2008-6-26 23:37

回复 1# ereal 的帖子

把EDIT定义成DOUBLE 添加EDIT的适时响应,在里面通过GETWINDOWSTEXT,用CSTRING找到小数点的位置判断小数点后面的长度即小数点后的位数做出你相应的操作,可惜电脑主电源坏了同学电脑没装VC,要不可以写给你

lyd253261362 发表于 2008-6-27 09:34

Edit Box

Edit窗口是用来接收用户输入最常用的一个控件。创建一个输入窗口可以使用成员函数:
BOOL CEdit::Create( LPCTSTR lpszText, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID = 0xffff );
其中dwStyle将指明该窗口的风格,除了子窗口常用的风格WS_CHILD,WS_VISIBLE外,你可以针对输入控件指明专门的风格。

ES_AUTOHSCROLL,ES_AUTOVSCROLL 指明输入文字超出显示范围时自动滚动。
ES_CENTER,ES_LEFT,ES_RIGHT 指定对齐方式
ES_MULTILINE 是否允许多行输入
ES_PASSWORD 是否为密码输入框,如果指明该风格则输入的文字显示为*
ES_READONLY 是否为只读
ES_UPPERCASE,ES_LOWERCASE 显示大写/小写字符
控制显示的文本利用成员函数SetWindowText/GetWindowText用于设置/得到当前显示的文本。

通过GetLimitText/SetLimitText可以得到/设置在输入框中输入的字符数量。

由于在输入时用户可能选择某一段文本,所以通过void CEdit::GetSel( int& nStartChar, int& nEndChar )得到用户选择的字符范围,通过调用void CEdit::SetSel( int nStartChar, int nEndChar, BOOL bNoScroll = FALSE )可以设置当前选择的文本范围,如果指定nStartChar=0 nEndChar=-1则表示选中所有的文本。void ReplaceSel( LPCTSTR lpszNewText, BOOL bCanUndo = FALSE )可以将选中的文本替换为指定的文字。

此外输入框还有一些和剪贴板有关的功能,void Clear( );删除选中的文本,void Copy( );可将选中的文本送入剪贴板,void Paste( );将剪贴板中内容插入到当前输入框中光标位置,void Cut( );相当于Copy和Clear结合使用。

最后介绍一下输入框几种常用的消息映射宏:

ON_EN_CHANGE 输入框中文字更新后产生
ON_EN_ERRSPACE 输入框无法分配内存时产生
ON_EN_KILLFOCUS / ON_EN_SETFOCUS 在输入框失去/得到输入焦点时产生
使用以上几种消息映射的方法为定义原型如:afx_msg void memberFxn( );的函数,并且定义形式如ON_Notification( id, memberFxn )的消息映射。如果在对话框中使用输入框,Class Wizard会自动列出相关的消息,并能自动产生消息映射代码。

lyd253261362 发表于 2008-6-27 09:37

解决思路

可能涉及到的问题
1:如何判断一个字符串是数字还是别的类型.
2:如何查找一个字符串中某个符号出现的次数.
3:如何设置EDIT光标的位置.
1 问题的解决方法可以利用下面的方法解决.
CString strtemp=szTemp.SpanIncluding("0123456789");
if(!strtemp.IsEmpty()) //这个字符串为数字
else
//非数字
2 问题我用循环递归的方法实现,首先查找最先出现的符号位置,然后利用字符串分割技术取RIGHT部分再进 行循环调用就可以了,相关代码可以见下:
int CNumEditCtrl::GetStringNum(CString szVal)//获得字符串中间.号的个数
{
int nNum=0;
while(1)
{
int nCount=szVal.Find('.');
if(nCount==-1)
break;
szVal=szVal.Right(szVal.GetLength()-nCount-1);
nNum++;
}
return nNum;

}
3 问题可以采用获得EDIT控件句柄发送EM_SETSEL消息的方法实现.

所以基本代码可以实现见下了:
void CNumEditCtrl::OnChange()
{
// TODO: If this is a RICHEDIT control, the control will not
// send this notification unless you override the CEdit::OnInitDialog()
// function and call CRichEditCtrl().SetEventMask()
// with the ENM_CHANGE flag ORed into the mask.
CString m_estr,szTemp;
GetWindowText(m_estr);
int nLen=m_estr.GetLength();
if(!m_estr.IsEmpty())
{
szTemp=m_estr.Right(1);
BOOL bNum=TRUE;
CString strtemp=szTemp.SpanIncluding("0123456789");
if(!strtemp.IsEmpty())
bNum=TRUE;
else
bNum=FALSE;

nPoint=GetStringNum(m_estr);

if(strcmp(szTemp,".")==0 || bNum)
{
if(nPoint>1)
{
nPoint--;
::AfxMessageBox(".号出现次数超过两次!");
m_estr=m_estr.Left(m_estr.GetLength()-1);
SetWindowText(m_estr);
nLen--;
SendMessage(EM_SETSEL,nLen,nLen);
return;
}
}
else
{
::AfxMessageBox("输入格式错误");
m_estr=m_estr.Left(m_estr.GetLength()-1);
SetWindowText(m_estr);
nLen--;
SendMessage(EM_SETSEL,nLen,nLen);
return;
}
}
// TODO: Add your control notification handler code here

}

//备注:来自www.codesky.net
下面是程序的演示图片:

[[it] 本帖最后由 lyd253261362 于 2008-6-27 09:47 编辑 [/it]]

saner100200 发表于 2008-6-29 21:51

刚学VC++...浏览过...公司是自动化控制的..用到MFC编程..

页: [1]

Powered by Discuz! Archiver 6.1.0  © 2001-2007 Comsenz Inc.