CComboBox的tpye为Drop List,并通过InsertString(0,"F1"),InsertString(1,"F2"),,,,InsertString(11,"F12"),实现按下F1键自动变成F1项,按下F2自动变成F2项...按下F12键自动变成F12项.可是,出现一个问题,就是按F10的时候不会自动变成F10项,其余都可以。通过PreTranslateMessage(MSG* pMsg)和OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)都不可以实现。哪位知道的回下,本人不甚感激。

解决方案 »

  1.   


    BOOL CXXXXDlg::PreTranslateMessage(MSG* pMsg) 
    {
    // TODO: Add your specialized code here and/or call the base class
    if(WM_SYSKEYDOWN == pMsg->message || WM_KEYDOWN == pMsg->message)
    {
    switch(pMsg->wParam)
    {
    case VK_F10:
    m_combo.SetCurSel(9);
    break; default:
    break;
    }
    }
    return CDialog::PreTranslateMessage(pMsg);
    }
      

  2.   

    你这方法我早试过了,而且不只是F10。
    按F1会调用系统的帮助文档,其实是找不到系统的帮助文档,所以会谈出个对话框,但也会改变到F1项。
    按F4则是显示下拉框的全部内容,也会改变到F4项。
    但是按F10就很奇怪了,好像是禁止控件接受F1~F9,F11~12。同时我发现按完F10键后(不发生改变),再去按F1键,控件继续去调用系统的帮助文档(就是弹出个对话框),但不改变成F1项,这时再去按其他键就可以改变了。
    简而言之,就是,按完F10之后,控件禁止接受F1~F9,F11,F12。但是这个时候按F1会调用系统的帮助文档。
    不知道哪位大侠能解释解释。
      

  3.   

    BOOL CXXXXDlg::PreTranslateMessage(MSG* pMsg) 
    {
        // TODO: Add your specialized code here and/or call the base class
        if(WM_SYSKEYDOWN == pMsg->message || WM_KEYDOWN == pMsg->message)
        {
            switch(pMsg->wParam)
            {
            case VK_F10:
                m_combo.SetCurSel(9);
                break;        default:
                break;
            }
        }
        return CDialog::PreTranslateMessage(pMsg);
    }按完F10之后,控件禁止接受F1~F9,F11,F12。但是这个时候按F1会调用系统的帮助文档是
    因为热键冲突
      

  4.   

    已解决啦~
    BOOL CXXXXDlg::PreTranslateMessage(MSG* pMsg) 
    {
        // TODO: Add your specialized code here and/or call the base class
        if(WM_SYSKEYDOWN == pMsg->message || WM_KEYDOWN == pMsg->message)
        {
            switch(pMsg->wParam)
            {
            case VK_F10:
                m_combo.SetCurSel(9);
                break;        default:
                break;
            }
            return 1;
        }
        return CDialog::PreTranslateMessage(pMsg);
    }
    对于这个函数,我认真的看了下MSDN上的解释,终于清楚了,相信大家看完也就明白了。
    Return Value
    Nonzero if the message was translated and should not be dispatched; zero if the message was not translated and should be dispatched.
    但是还是有个问题,按F1照样会调用系统帮助文档,这时可增加WM_HELPINFO,并在
    BOOL CXXXDlg::OnHelpInfo(HELPINFO* pHelpInfo) 
    {
    // TODO: Add your message handler code here and/or call default
    return 1;
    //return CComboBox::OnHelpInfo(pHelpInfo);
    }
    就可以解决F1的问题了。