如何获取CMFCRibbonComboBox的keydown通知?

时间:2016-09-27 15:01:47

标签: mfc cmfcribbonpanel

我在ribonbar上有CMFCRibbonComboBox,我希望当用户按下一个键打开的下拉列表并选择项目按下按用户按下的字符时。

为此我想获得keydown的通知。

我该怎么办? 感谢

1 个答案:

答案 0 :(得分:0)

我在MSDN here上提出了一个非常类似的问题,并最终通过以下黑客解决了这个问题;

C:\ Program Files(x86)\ Microsoft Visual Studio 14.0 \ VC \ atlmfc \ src \ mfc \ afxribbonedit.cpp 的本地副本保存到您的项目中

BOOL CMFCRibbonRichEditCtrl::PreTranslateMessage(MSG* pMsg)中替换此

    case VK_DOWN:
        if (m_edit.m_bHasDropDownList && !m_edit.IsDroppedDown())
        {
            m_edit.DropDownList();
            return TRUE;
        }

用这个

case VK_DOWN:
        if (m_edit.m_bHasDropDownList && !m_edit.IsDroppedDown())
        {
            m_edit.DropDownList();
            CMFCRibbonBaseElement* pRibbonBaseElement = m_edit.GetDroppedDown();
            if (pRibbonBaseElement && (pRibbonBaseElement->IsKindOf(RUNTIME_CLASS(CMFCRibbonComboBox))))
            {
                CString str;
                GetWindowText(str);
                CMFCRibbonComboBox *pCombo = (CMFCRibbonComboBox*)pRibbonBaseElement;
                int ItemNo = -1;
                for (int i = 0; i < pCombo->GetCount(); i++)
                {
                    CString ItemText = pCombo->GetItem(i);
                    if (ItemText.Left(str.GetLength()).CompareNoCase(str) == 0)
                    {
                        ItemNo = i;
                        break;
                    }
                }
                if (ItemNo != -1)
                {
                    pCombo->OnSelectItem(ItemNo);
                    // Draw and redraw dropdown for selection to show
                    m_edit.DropDownList();
                    m_edit.DropDownList();
                }
            }
            return TRUE;
        }

对于下拉列表(与下拉列表相反),您可以类似地根据当前位置之后的下一个项目,根据WM_CHAR进行首字母搜索。请注意,上述黑客攻击需要针对功能区库的任何未来更新进行检查,并且应该在库中正确实现后转储。