用VC做一个文本框。
要求:前三个必须是英文字母,大写。后三位为数字。
void CHexEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) 
CHexEdit(CEDIT派生类)
是否是在这个派生类函数中实现??
怎样实现??谢谢!!

解决方案 »

  1.   

    希望以下对你有帮助:如何限制编辑框中的准许字符
     
    如果用户在编辑控件中只允许接收数字,可以使用一个标准的编辑控件并指定新
    的创建标志ES_NUMBERS,它是Windows 95新增加的标志,该标志限制 编辑控件只
    按收数字字符。如果用户需要复杂的编辑控件,可以使用Microsoft 的屏蔽编辑
    控件,它是一个很有用的OLE定制控件。
    如果希望不使用OLE 定制控件自己处理字符,可以派生一个CEdit类并处理
    WM_CHAR消息,然后从编辑控件中过滤出特定的字符。首先,使用ClassWizard
    建立一个 CEdit的派生类,其次,在对话类中指定一个成员变量将编辑控件分
    类在OnInitdialog 中调用CWnd: : SubclassDlgItem .//In your dialog class declaration (.H file )
    private : CMyEdit m_wndEdit // Instance of your new edit control .//In you dialog class implementation (.CPP file )
    BOOL CSampleDialog : : OnInitDialog ( )
    {
     … //Subclass the edit lontrod .
     m_wndEdit .SubclassDlgItem (IDC_EDIT,this) …
    }使用ClassWizard处理WM_CHAR消息,计算nChar参量并决定所执行的操作,
    用户可以确定是否修改、传送字符。下例说明了如何显示字母字符,如果字
    符是字母字符,则调用CWnd OnChar,否则不调用OnChar.
    //Only display alphabetic dharacters .
    void CMyEdit : : OnChar (UINT nChar , UINT nRepCnt , UITN nFlags )
    {
     //Determine if nChar is an alphabetic character.
     if (: : IsCharAlpha ( ( TCHAR) nChar ) )
     CEdit : : OnChar (nChar, nRepCnt , nFlags )
    }如果要修改字符,则不能仅仅简单地用修改过的nChar调用CEdit: : OnChar,
    然后CEdit: : OnChar调用CWnd: : Default获取原来的wParam 和lParam 的值,
    这样是不行的。要修改一个字符,需要首先修改nChar,然后用修改过的nChar
    调用CWnd: : DefWindowProc。下例说明了如何将字符转变为大写:
    //Make all characters uppercase
    void CMyEdit : : OnChar (UINT nChar , UINT nRepCnt , UINT nFlags )
    {
     //Make sure character is uppercase .
     if (: : IsCharAlpha ( .( TCHAR) nChar)
     nChar=: : CharUpper(nChar ) //Bypass default OnChar processing and directly call
     //default window proc.
     DefWindProc (WM_CHAR, nChar , MAKELPARAM (nRepCnt, nFlags ))
    }
      

  2.   

    在Keydown事件里面取得,当前光标的当前输入位置,如果输入的不符合要求。把输入的字符cut掉。取得光标当前位置可以使用:
    long fncGetColNo(CEdit* pEdit)
    {
    long i;
    long j;
    long k;
    long LineNo;
    long ColNo;
    i = ::SendMessage(pEdit->m_hWnd, EM_GETSEL, NULL, NULL);
    j=i / 65536;
        LineNo = ::SendMessage(pEdit->m_hWnd, EM_LINEFROMCHAR, j, 0);
    LineNo = LineNo + 1;
        k = ::SendMessage(pEdit->m_hWnd, EM_LINEINDEX, -1, 0);
        ColNo = j - k + 1;
    return ColNo;
    }
    提醒你:千万不能仅仅考虑过滤键盘事件,还应该考虑用户通过ctrl+V键粘贴,还应该防止用户通过键盘上的pop menu键弹出粘贴项目。
    我劝你,还不如听从上面朋友的建议,不要实时的过滤,还是到提交的时候作输入格式的合法性check比较好,又简单,又安全。通常的程序也都是这样做的。
    =
    ================================================================CSDN 论坛助手 Ver 1.0 B0402提供下载。 改进了很多,功能完备!★  浏览帖子速度极快![建议系统使用ie5.5以上]。 ★  多种帖子实现界面。 
    ★  保存帖子到本地[html格式]★  监视您关注帖子的回复更新。
    ★  可以直接发贴、回复帖子★  采用XML接口,可以一次性显示4页帖子,同时支持自定义每次显示帖子数量。可以浏览历史记录! 
    ★  支持在线检测程序升级情况,可及时获得程序更新的信息。★★ 签名  ●  
         可以在您的每个帖子的后面自动加上一个自己设计的签名哟。Http://www.ChinaOK.net/csdn/csdn.zip
    Http://www.ChinaOK.net/csdn/csdn.rar
    Http://www.ChinaOK.net/csdn/csdn.exe    [自解压]
      

  3.   

    重载edit的killfocus函数,在killfocus时进行检查,看edit中的内容是否符合你的格式要给。
      

  4.   

    void CSetupDlg::OnButton3() 
    {
    // TODO: Add your control notification handler code here
    char buff[100];
    ZeroMemory(buff,100);
    UpdateData(TRUE);
    strcpy(buff,m_MailAddr);
    for (int i=0;i<3;i++)
    {
    if ((buff[i]<65)||(buff[i]>90))
    {
    MessageBox("不是大写字母");
    break;
    } }
    for (int k=3;k<6;k++)
    {
    if ((buff[k]<48)||(buff[k]>57))
    {
    MessageBox("不是数字");
    break;
    }
    }

    }