如何获取CMFCRibbonComboBox的按键关闭通知?

如何获取CMFCRibbonComboBox的按键关闭通知?,mfc,cmfcribbonpanel,Mfc,Cmfcribbonpanel,我在ribonbar上有一个CMFCRibbonComboBox,我想当用户按下一个键时打开一个droplist并根据用户按下的字符选择项目 为此,我想获得keydown的通知 我该怎么做呢? 谢谢我在MSDN上问了一个非常类似的问题,最终我自己用以下方法解决了这个问题: 将C:\Program Files(x86)\Microsoft Visual Studio 14.0\VC\atlmfc\src\mfc\afxribbonedit.cpp的本地副本保存到项目中 在BOOL CMFCRibb

我在ribonbar上有一个CMFCRibbonComboBox,我想当用户按下一个键时打开一个droplist并根据用户按下的字符选择项目

为此,我想获得keydown的通知

我该怎么做呢?
谢谢

我在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;
        }
case VK_DOWN:
if(m_edit.m_bHasDropDownList&!m_edit.IsDroppedDown())
{
m_edit.DropDownList();
CMFCRibbonBaseElement*pRibbonBaseElement=m_edit.GetDroppedDown();
if(pRibbonBaseElement&(pRibbonBaseElement->IsKindOf(运行时类(cmfcribboncompobox)))
{
CString-str;
GetWindowText(str);
CMFCRIBBONCOMBOX*pCombo=(CMFCRIBBONCOMBOX*)pRibbonBaseElement;
int ItemNo=-1;
对于(inti=0;iGetCount();i++)
{
CString ItemText=pCombo->GetItem(i);
if(ItemText.Left(str.GetLength()).CompareNoCase(str)==0)
{
ItemNo=i;
打破
}
}
如果(项目编号!=-1)
{
pCombo->OnSelectItem(项目编号);
//绘制和重画下拉列表以显示所选内容
m_edit.DropDownList();
m_edit.DropDownList();
}
}
返回TRUE;
}

对于下拉列表(与下拉列表相反),您可以类似地使用WM_CHAR根据当前位置后的下一项进行首字母搜索。请注意,需要针对ribbon库的任何未来更新检查上述黑客行为,并在库中正确实施后将其丢弃。

我在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;
        }
case VK_DOWN:
if(m_edit.m_bHasDropDownList&!m_edit.IsDroppedDown())
{
m_edit.DropDownList();
CMFCRibbonBaseElement*pRibbonBaseElement=m_edit.GetDroppedDown();
if(pRibbonBaseElement&(pRibbonBaseElement->IsKindOf(运行时类(cmfcribboncompobox)))
{
CString-str;
GetWindowText(str);
CMFCRIBBONCOMBOX*pCombo=(CMFCRIBBONCOMBOX*)pRibbonBaseElement;
int ItemNo=-1;
对于(inti=0;iGetCount();i++)
{
CString ItemText=pCombo->GetItem(i);
if(ItemText.Left(str.GetLength()).CompareNoCase(str)==0)
{
ItemNo=i;
打破
}
}
如果(项目编号!=-1)
{
pCombo->OnSelectItem(项目编号);
//绘制和重画下拉列表以显示所选内容
m_edit.DropDownList();
m_edit.DropDownList();
}
}
返回TRUE;
}

对于下拉列表(与下拉列表相反),您可以类似地使用WM_CHAR根据当前位置后的下一项进行首字母搜索。请注意,需要针对功能区库的任何未来更新检查上述黑客行为,并在功能区库中正确实施后将其丢弃。

为什么您要尝试重新发明标准组合框功能?我很乐意接受任何解决方案,我无法找到如何使用标准方式。请您帮助me?@linspectable,因为MFC功能区组合框缺少普通MFC和Windows组合框的许多非常重要的基本功能,例如搜索。因为UI MFC功能区有一些明显的遗漏。你为什么要重新发明标准组合框功能?我很乐意使用任何我找不到的解决方案,以标准方式使用它。你能帮我吗?@linspectable,因为MFC功能区组合框缺少很多普通MFC和Windows的基本功能和非常重要的功能组合框,例如搜索。作为一个UI MFC功能区,有一些非常明显的遗漏。