关于EditBox编辑框控件的输入问题 如何在编辑框控件中输入特定的字符,而且还要在每输入一个字符时都会作出判断,若不符合要求则报错或不能输入?比如现在只能输入如下的字符“abcdefg123456”,可以重复输入,只要输入的每一个字符都是字符串“abcdefg123456”中的任意一个。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 void CCustomEdit::OnEnChange(){ CString data; GetWindowText(data); int len = data.GetLength(); for (int i = len - 1; i >= 0; i--) { if (m_validChars.Find(data.GetAt(i)) == -1) { data.Delete(i); } }} 回复一楼(binglingshuang):很感谢你的回贴!好像你还没具体回答我的问题,我是想要输入限定的字符,你好像没有作比较?代码中m_validChars是什么变量呢,是否是限定的字符串,如果是,那你这没赋值啊?还有m_validChars是对应编辑框控件变量吗? void CEditEx::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) { static const char validchars[]="abcdefg123456"; if ( strchr(validchars, nChar) ) DefWindowProc(WM_CHAR, nChar, MAKELONG(nRepCnt, nFlags)); //CEdit::OnChar(nChar, nRepCnt, nFlags);} 自己新建一个类继承于CEdit,类名CMyEdit,为CMyEdit类添加OnChar消息映射,代码如下void CEditEx::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) {static const char* validchars ="abcdefg123456";if ( strchr(validchars, nChar) )DefWindowProc(WM_CHAR, nChar, MAKELONG(nRepCnt, nFlags));//CEdit::OnChar(nChar, nRepCnt, nFlags);}然后,通过ClassWizard为你的输入框添加成员变量,类型是Control类,CMyEdit类型,这样就行了 void CEditEx::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) 这个函数是否在新建的CMyEdit类cpp文件下啊?我把这个函数加在我的一个工程中还是不行,在编辑框中仍能输入任意字符,包括数字,并没有达到我的要求。 我不知道我缺些什么,总不行啊!我只建了一个生成.exe文件的对话框工程,在对话框里加了一个编辑框控件,然后添加OnChar消息映射,并按你的要求添加了成员变量,最后在OnChar()函数中加入你给的代码,接着编译运行。结果还是可以输入任何字符,是否缺了什么函数呢,譬如对话框或变量的初始化等等?或者还有什么的?sSource Files: MyEdit.cpp StdAfx.cpp TezxteEdit.cpp TextEditDlg.cpp Header Files: MyEdit.h TextEdit.h TextEditdlg.h StdAfx.h Resource.hyou些单词敲错了,希望你能看懂,因为改不过来。谢谢! 首先,建立CMyEdit类继承于于CEdit类,为CMyEdit类添加WM_CHAR消息,映射到OnChar函数,注意这个OnChar函数是属于CMyEdit类的,然后在该方法中代码如下:void CEditEx::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) {static const char* validchars ="abcdefg123456";if ( strchr(validchars, nChar) )DefWindowProc(WM_CHAR, nChar, MAKELONG(nRepCnt, nFlags));//CEdit::OnChar(nChar, nRepCnt, nFlags);}最后,通过ClassWizard为你的输入框添加成员变量,类型是Control类,CMyEdit类型,这样就行了。按此顺序操作,应该没问题的。你也可以另外新建个工程试一下。 对了,别忘了,在TextEditdlg.h头文件中要#include "MyEdit.h" 那算了,我再试试。我想问一下DefWindowProc()函数如何用?我看MSDN,不太懂。 重载,然后在OnChar中处理 如何在编辑框控件中输入特定的字符,而且还要在每输入一个字符时都会作出判断,若不符合要求则报错或不能输入?比如现在只能输入如下的字符“abcdefg123456”,可以重复输入,只要输入的每一个字符都是字符串“abcdefg123456”中的任意一个。还有再强调一个要求就是在每输入一个字符时都会作出判断,若不符合要求则报错或不能输入?哪位高手帮帮忙,帮我改一下,先谢谢了!最好留给邮箱,我发过去。急急!!! 怎么没人回复呢?我将代码贴出来,让大家看看,能不能帮忙改一下?// MyEdit.cpp : implementation file#include "stdafx.h"#include "TestEdit.h"#include "MyEdit.h"BEGIN_MESSAGE_MAP(CMyEdit, CEdit) //{{AFX_MSG_MAP(CMyEdit) ON_WM_CHAR() //}}AFX_MSG_MAPEND_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////// CMyEdit message handlersvoid CMyEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) { // TODO: Add your message handler code here and/or call default static const char* validchars ="abcdefg123456"; if ( strchr(validchars, nChar) ) { DefWindowProc(WM_CHAR, nChar, MAKELONG(nRepCnt, nFlags)); } CEdit::OnChar(nChar, nRepCnt, nFlags);}// TestEditDlg.cpp : implementation file#include "stdafx.h"#include "TestEdit.h"#include "TestEditDlg.h"#include "MyEdit.h"..void CTestEditDlg::DoDataExchange(CDataExchange* pDX){ CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CTestEditDlg) DDX_Control(pDX, IDC_EDIT1, m_EditNum); //}}AFX_DATA_MAP}..// MyEdit.h : header file...protected: //{{AFX_MSG(CMyEdit) afx_msg void OnChar(UINT nChar, UINT nRepCnt, UINT nFlags); //}}AFX_MSG...//TestEditDlg.cppvoid CTestEditDlg::DoDataExchange(CDataExchange* pDX){ CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CTestEditDlg) DDX_Control(pDX, IDC_EDIT1, m_EditNum); //}}AFX_DATA_MAP}//其它没帖出来的代码就是新建工程和类时没有改变的CMyEdit是我新建的类,继承CEdit我就是照着jonvin_ain的做法做的是否还要在TestEditDlg.cpp中加什么函数,或是缺什么呢? 怎么搞好的。我也遇到了相同的问题。就是不知道在#include "MyEdit.h "放到哪里? 只会<vc++深入详解>讲的多线程和socket。。。 有关TCP客户端程序的建立问题 ATL 如何显示带有滚动条的窗口 mscomm的问题,没有接收数据的响应~~~~~~~~~~急 请问在一个用sdk写的程序里面,如何使用mfc的类? 电子书库,好 我是初学者,请问各位一个问题,在多文档界面中,能不能把菜单去掉和隐藏? 请教有关vc转换成C++builder的问题! 初学者的问题??? 那位大虾知道《win2000API超级宝典》这本书怎么样? VC绘制曲线 算法问题 请教高手 dialogbar中的编辑框数据传出问题 请高手指教
{
CString data;
GetWindowText(data);
int len = data.GetLength(); for (int i = len - 1; i >= 0; i--)
{
if (m_validChars.Find(data.GetAt(i)) == -1)
{
data.Delete(i);
}
}}
很感谢你的回贴!
好像你还没具体回答我的问题,我是想要输入限定的字符,你好像没有作比较?
代码中m_validChars是什么变量呢,是否是限定的字符串,如果是,那你这没赋值啊?
还有m_validChars是对应编辑框控件变量吗?
{
static const char validchars[]="abcdefg123456";
if ( strchr(validchars, nChar) )
DefWindowProc(WM_CHAR, nChar, MAKELONG(nRepCnt, nFlags));
//CEdit::OnChar(nChar, nRepCnt, nFlags);
}
{
static const char* validchars ="abcdefg123456";
if ( strchr(validchars, nChar) )
DefWindowProc(WM_CHAR, nChar, MAKELONG(nRepCnt, nFlags));
//CEdit::OnChar(nChar, nRepCnt, nFlags);
}然后,通过ClassWizard为你的输入框添加成员变量,类型是Control类,CMyEdit类型,这样就行了
这个函数是否在新建的CMyEdit类cpp文件下啊?我把这个函数加在我的一个工程中还是不行,在编辑框中仍能输入任意字符,包括数字,并没有达到我的要求。
然后添加OnChar消息映射,并按你的要求添加了成员变量,最后在OnChar()函数中加入你给的代码,接着编译运行。结果还是可以输入任何字符,是否缺了什么函数呢,譬如对话框或变量的初始化等等?或者还有什么的?
sSource Files:
MyEdit.cpp
StdAfx.cpp
TezxteEdit.cpp
TextEditDlg.cpp Header Files:
MyEdit.h
TextEdit.h
TextEditdlg.h
StdAfx.h
Resource.h
you些单词敲错了,希望你能看懂,因为改不过来。谢谢!
{
static const char* validchars ="abcdefg123456";
if ( strchr(validchars, nChar) )
DefWindowProc(WM_CHAR, nChar, MAKELONG(nRepCnt, nFlags));
//CEdit::OnChar(nChar, nRepCnt, nFlags);
}最后,通过ClassWizard为你的输入框添加成员变量,类型是Control类,CMyEdit类型,这样就行了。按此顺序操作,应该没问题的。你也可以另外新建个工程试一下。
我想问一下DefWindowProc()函数如何用?我看MSDN,不太懂。
然后在OnChar中处理
比如现在只能输入如下的字符“abcdefg123456”,可以重复输入,只要输入的每一个字符都是字符串“abcdefg123456”中的任意一个。还有再强调一个要求就是在每输入一个字符时都会作出判断,若不符合要求则报错或不能输入?哪位高手帮帮忙,帮我改一下,先谢谢了!
最好留给邮箱,我发过去。急急!!!
我将代码贴出来,让大家看看,能不能帮忙改一下?// MyEdit.cpp : implementation file#include "stdafx.h"
#include "TestEdit.h"
#include "MyEdit.h"BEGIN_MESSAGE_MAP(CMyEdit, CEdit)
//{{AFX_MSG_MAP(CMyEdit)
ON_WM_CHAR()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////
// CMyEdit message handlersvoid CMyEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: Add your message handler code here and/or call default
static const char* validchars ="abcdefg123456";
if ( strchr(validchars, nChar) )
{
DefWindowProc(WM_CHAR, nChar, MAKELONG(nRepCnt, nFlags));
} CEdit::OnChar(nChar, nRepCnt, nFlags);
}
// TestEditDlg.cpp : implementation file#include "stdafx.h"
#include "TestEdit.h"
#include "TestEditDlg.h"
#include "MyEdit.h"
.
.
void CTestEditDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CTestEditDlg)
DDX_Control(pDX, IDC_EDIT1, m_EditNum);
//}}AFX_DATA_MAP
}
.
.// MyEdit.h : header file
...
protected:
//{{AFX_MSG(CMyEdit)
afx_msg void OnChar(UINT nChar, UINT nRepCnt, UINT nFlags);
//}}AFX_MSG
...
//TestEditDlg.cppvoid CTestEditDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CTestEditDlg)
DDX_Control(pDX, IDC_EDIT1, m_EditNum);
//}}AFX_DATA_MAP
}
//其它没帖出来的代码就是新建工程和类时没有改变的CMyEdit是我新建的类,继承CEdit我就是照着jonvin_ain的做法做的
是否还要在TestEditDlg.cpp中加什么函数,或是缺什么呢?