Как получить уведомление для keydown для CMFCRibbonComboBox?

У меня есть CMFCRibbonComboBox на ribonbar, и я хочу, чтобы этот пользователь нажимал на раскрывающийся список с открытым ключом и выбирал пункт, соответствующий символам, нажимаемым пользователем.

Для этого я хочу получить уведомление о keydown.

Как я могу это сделать? Спасибо

1 ответ

Я задал очень похожий вопрос на MSDN здесь и в конце концов решил сам с помощью следующего хака;

Сохраните локальную копию 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, чтобы выполнить поиск первой буквы на основе следующего элемента после текущей позиции. Обратите внимание, что приведенный выше взлом должен быть проверен на предмет любых будущих обновлений библиотеки ленточных носителей и должен быть сброшен после правильной реализации в библиотеке.

Другие вопросы по тегам