我在 ribonbar 上有 CMFCRibbonComboBox ,我希望当该用户按下一个键打开下拉列表并选择 Item acurding to chars that by user.
为此,我想获得 keydown 的通知。
我该怎么做?谢谢
我在 ribonbar 上有 CMFCRibbonComboBox ,我希望当该用户按下一个键打开下拉列表并选择 Item acurding to chars that by user.
为此,我想获得 keydown 的通知。
我该怎么做?谢谢
我在这里在 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 根据当前位置之后的下一个项目进行首字母搜索。请注意,需要针对功能区库的任何未来更新检查上述黑客攻击,并且一旦在库中正确实施就应该转储。