我在DIALOG上放一个ComboBox控件IDC_COMBO,样式为下拉.我想让它只接受数字输入,所以我派生一个类CMyComBox,映射到IDC_COMBO,处理WM_CHAR消息,如下:
void OnChar(UINT nChar......){
if (nChar=>0 && nChar=<9){
  CComboBox::OnChar(UINT nChar......);
   }
}可是我在控件中输入字符时,没有效果.跟踪程序执行,发现控件IDC_COMBO跟本没有响应WM_CHAR消息.怎么回事?
各位大侠可以自己试试.CComboBox控件不响应WM_CHAR消息.

解决方案 »

  1.   

    还有一种方法是先获取combobox内含的那个edit控件的控制权
    然后让它只接受数字
      

  2.   

    不过这种方法难度也不小,GetComboBoxInfo(...)函数可以获取
    edit控件的句柄,但不知道是不是真的有用
    我以前是用enum child windows来实现的
      

  3.   

    0.在对话框模板中添加一个ComboBox控件,ID:IDC_COMBO
    1.你可以自己定义一个ComboBox的派生类CYourComboBox
    2.然后在对话框的.h文件中声明一个变量 CYourComboBox m_combo
    3.在对话框的初始化函数中添加如下代码:
    m_combo.SubclassDlgItem(IDC_COMBO,this);
    4.在派生类中响应鼠标单击事件
      

  4.   

    重载ComboBox控件的ON_CBN_EDITUPDATE消息,该消息可以在输入字符后但显示之前通知你,你只需进行检测即可剔除数字之外的任何字符了。
      

  5.   

    我有一个笨方法
    重载Dialog的PreTranslateMessage方法
    if( GetFocus()->GetDlgCtrlID() == IDC_YOUR_COMBOBOX )
    {
        if( pMsg->message == WM_KEYDOWN && !( pMsg->wParam >= '0' && pMsg->wParam <= 9 ) )
        {
             pMsg->wParam = VK_CTRL;
             return TRUE;
        }
    }
      

  6.   

    子类化了,如果换成CEdit控件,就会成功,只接受数字输入,但换成CComboBox就不行.
    我是菜鸟,有没有简单一点的方法?最直接最好.
      

  7.   

    处理CBN_EDITUPDATE倒是不错的解决方法
      

  8.   

    我给你试了试,具体代码如下:
    void CTestDlg::OnEditupdateCombo1() 
    {
    // TODO: Add your control notification handler code here
    DWORD dwSel = m_cb.GetEditSel();
    WORD wSel = LOWORD( dwSel );
    if( wSel == 0 ) return;
    wSel--;
    char strEdit[100];
    memset( strEdit, 0, 100 );
    m_cb.GetWindowText( strEdit, 100 );
    if( strEdit[wSel] >= '0' && strEdit[wSel] <= '9' ) return;
    strEdit[wSel] = 0;
    strcpy( strEdit+wSel, strEdit+wSel+1 );
    m_cb.SetWindowText( strEdit );
    m_cb.SetEditSel( LOWORD(dwSel), HIWORD(dwSel) );
    }
    仅仅是测试代码,对边界问题没有做过多考虑,实际应用时应该考虑。
      

  9.   

    这个是API,可以在MSDN里查找它的用法,不过好像不太有效
    处理CBN_EDITUPDATE应该可以吧//BTW:为什么我的短消息发不出去?