如何在编辑框控件中输入特定的字符,而且还要在每输入一个字符时都会作出判断,若不符合要求则报错或不能输入?
比如现在只能输入如下的字符“abcdefg123456”,可以重复输入,只要输入的每一个字符都是字符串“abcdefg123456”中的任意一个。

解决方案 »

  1.   

    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);
    }
    }}
      

  2.   

    回复一楼(binglingshuang):
    很感谢你的回贴!
    好像你还没具体回答我的问题,我是想要输入限定的字符,你好像没有作比较?
    代码中m_validChars是什么变量呢,是否是限定的字符串,如果是,那你这没赋值啊?
    还有m_validChars是对应编辑框控件变量吗?
      

  3.   

    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);
    }
      

  4.   

    自己新建一个类继承于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类型,这样就行了
      

  5.   

    void CEditEx::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) 
    这个函数是否在新建的CMyEdit类cpp文件下啊?我把这个函数加在我的一个工程中还是不行,在编辑框中仍能输入任意字符,包括数字,并没有达到我的要求。
      

  6.   

    我不知道我缺些什么,总不行啊!我只建了一个生成.exe文件的对话框工程,在对话框里加了一个编辑框控件,
    然后添加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些单词敲错了,希望你能看懂,因为改不过来。谢谢!
      

  7.   

    首先,建立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类型,这样就行了。按此顺序操作,应该没问题的。你也可以另外新建个工程试一下。
      

  8.   

    对了,别忘了,在TextEditdlg.h头文件中要#include "MyEdit.h"
      

  9.   

    那算了,我再试试。
    我想问一下DefWindowProc()函数如何用?我看MSDN,不太懂。
      

  10.   

    重载,
    然后在OnChar中处理
      

  11.   

    如何在编辑框控件中输入特定的字符,而且还要在每输入一个字符时都会作出判断,若不符合要求则报错或不能输入?
    比如现在只能输入如下的字符“abcdefg123456”,可以重复输入,只要输入的每一个字符都是字符串“abcdefg123456”中的任意一个。还有再强调一个要求就是在每输入一个字符时都会作出判断,若不符合要求则报错或不能输入?哪位高手帮帮忙,帮我改一下,先谢谢了!
    最好留给邮箱,我发过去。急急!!!
      

  12.   

    怎么没人回复呢?
    我将代码贴出来,让大家看看,能不能帮忙改一下?// 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中加什么函数,或是缺什么呢?
      

  13.   

    怎么搞好的。我也遇到了相同的问题。就是不知道在#include   "MyEdit.h "放到哪里?