1

我在 ribonbar 上有 CMFCRibbonComboBox ,我希望当该用户按下一个键打开下拉列表并选择 Item acurding to chars that by user.

为此,我想获得 keydown 的通知。

我该怎么做?谢谢

4

1 回答 1

0

我在这里在 MSDN 上问了一个非常相似的问题,并最终通过以下 hack 自己解决了这个问题;

将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 根据当前位置之后的下一个项目进行首字母搜索。请注意,需要针对功能区库的任何未来更新检查上述黑客攻击,并且一旦在库中正确实施就应该转储。

于 2016-10-16T11:27:08.497 回答