void CEditHex::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
// TODO: Add your message handler code here and/or call default

if(nChar>='a'&&nChar<='f')
{
nChar=nChar+'A'-'a';
SendMessage(WM_CHAR,nChar,nFlags);
return;
}
if(('0'<=nChar&&nChar<='9')||('A'<=nChar&&nChar<='F')||nChar==VK_BACK)
CEdit::OnChar(nChar,nRepCnt,nFlags);
}
用这个方法是不是要重写一个edit 控件?
有没有方法可以直接在dialog程序里面实现editbox只能输入16进制?

解决方案 »

  1.   

    可以,重写dialog中的PreTranslateMessage方法
      

  2.   

    BOOL CFmTestDlg::PreTranslateMessage( MSG *pMsg )
    {
    if( pMsg->hwnd == GetDlgItem(IDC_EDIT_TEXT)->GetSafeHwnd() && pMsg->message == WM_KEYDOWN ){
    char c = (char)pMsg->wParam;
    if( (c >= '0' && c <= '9') || (c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F') ){
    }
    else{
    return TRUE;
    }
    }
        return CDialog::PreTranslateMessage(pMsg);
    }
      

  3.   

    在.h文件里:
    BOOL PreTranslateMessage( MSG *pMsg );
    在.cpp文件里加上上面一段就行了
      

  4.   

    这个
    IDC_EDIT_TEXT
    不同的editbox会有不同的ID啊
    还有
    在哪触发这个函数呢?
      

  5.   

    直接在Edit的OnChange里面判断好了。
    如果有多个这样的控件的话可以考虑从CEdit派生类。
      

  6.   

    写在dialog里面的,没有onchange怎么办
    还有delete和back 键怎样写进去呢?
      

  7.   

    哦,忘了考虑退格键了,把我那个条件改一下就行了
    if( (c >= '0' && c <= '9') || (c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F') || c == VK_BACK)要加入其它有效的键照着改就行
      

  8.   

    从CEdit派生类有没有例子?