这个派生类只允许接受16进制字符的输入
而且输入过程中自动用空格按字节隔开
例如:键盘输入50163738,CEdit得到50 16 37 38 

解决方案 »

  1.   

    在编辑框内输入的是文本所以你必须把输入的文本数字读取到一个CString str对象内
    然后从左到右  2个2个地取数字并利用 atoi(str) 进行转换处理。居然怎么判断是否16进制的,就要写好过滤的代码了。
      

  2.   

    简单, 重载OnChar函数,在里面判断输入的字符是不是0-9 & a-z & A-Z & 空格。
      

  3.   


    void CHexEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) 
    {
    TCHAR tChar = (TCHAR) nChar; if((IsCharAlphaNumeric(tChar) && !IsCharAlpha(tChar)) 
    || (tChar >= 'a' && tChar <= 'f') || (tChar >= 'A' && tChar <= 'F') 
      || tChar == '\b')
    {
    CEdit::OnChar(nChar, nRepCnt, nFlags);
    }
    else
    {
    MessageBeep(MB_ICONASTERISK);
    }}
      

  4.   

    1.用GetWindowText()取得已输入的内容
    2.判断内容长度,每两个字符就加一个空格
    3.把结果显示到CEdit里兄弟,还是自已多动动手吧。
      

  5.   

    确实想的太简单了1.派生类的OnChar()函数必须响应BackSpace按键,否则无法修改录入的内容;
    2.对录入的内容进行判定,如果非16进制那么不响应;如果是16进制数据做双字节的判断,我写了下逻辑,各位看看
    OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
    {
    char ch = char(nChar); if (ch == '\b')//if the char is Backspace then deal with the edit
    { }
    else if(   !((ch >= '0' && ch <= '9') 
    || (ch >= 'A' && ch <= 'F') 
    || (ch >= 'a' && ch <= 'f'))
    )// if the char is non-heximal , then give up 
    {
    return;
    } CEdit::OnChar(nChar, nRepCnt, nFlags);//加上数字的处理}
      

  6.   

    重载CEdit类,加入成员变量unsigned short last;
    override 成员函数bool PreTranslaeMessage(MSG* pMsg)
    {
                   int c=(int)pMsg->wParam;
                   if(c>=48&&c<=57||c>='A'&&c<='F')
    {

    last++;
    if(last==2)
    {
       last=0;
                               SendMessage(WM_CHAR,32,0); 
    }
    return CEdit::PreTranslateMessage(pMsg);
    }
    else if(c>='a'&&c<='f')
    { last++;
    if(last==2)
    {
       last=0;
                               SendMessage(WM_CHAR,32,0); 
    }
    pMsg->wParam-=32; 
    return CEdit::PreTranslateMessage(pMsg);
    }
    else return TRUE;
    }
    例如键盘输入123456789
    则CEdit会这样显示:1 23 45 67 89.第一个字符会落单,后面的字符都可以.
    这个BUG真不知道出现在哪里????
      

  7.   

    把输入的字符都保存到CArray或CList中保存,每次有输入时,先检查输入字符的正确性,再用已保存的字符数组来判断当前操作能否继续执行
      

  8.   

    跟进去PRETRANSLATEMESSAGE调试下?
    last有初始化为0?
      

  9.   

    高手快来啊
    解决不了,我睡不安稳...为什么会有那样的BUG
      

  10.   

    你只是重载了PreTranslateMessage而已?
    其他函数怎么重载的,目前按你给的代码测试,发现字符无法输入。但看了一下原代码,发现last++ 这句,是不是应该放在
    追加字符之后才合理,不应该放在最开始的判断位置。

    另外,PreTranslateMessage内第一个判断内是不是漏了
    pMsg->wParam-=32;  这句?
      

  11.   

    你要仔细分析你自己的代码
    在PreTranslateMessage里SendMessage?
    要小心自己的逻辑!
    改成下面就OK了
    BOOL CDEdit::PreTranslateMessage(MSG* pMsg) 
    {
        if(pMsg->message==WM_CHAR)
        {
            int c=(int)pMsg->wParam; 
            if((c>=48&&c<=57)||(c>='A'&&c <='F')||(c>='a'&&c <='f')) 
            {         
                last++; 
                if(last==2) 
                { 
                    last=0; 
                    PostMessage(WM_CHAR,32,0); 
                } 
            } 
        }
        return CEdit::PreTranslateMessage(pMsg);
    }