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