2016-09-27 58 views
1

我有ribonbar上的CMFCRibbonComboBox,我希望當用戶按下一個鍵打開下拉列表,並選擇項目符合用戶按下的字符。如何爲CMFCRibbonComboBox獲取keydown的通知?

爲此目的,我想獲得keydown的通知。

我該怎麼做呢? 謝謝

+0

你爲什麼試圖重新發明標準的組合框功能? – IInspectable

+0

我會很高興任何解決方案,我不能找到如何以標準的方式,你可以幫我嗎? –

+0

@因爲MFC功能區組合框缺少常規MFC和Windows組合框的許多基本非常重要的功能,例如搜索。作爲一個用戶界面的MFC功能區有一些相當明顯的遺漏。 –

回答

0

我問了一個關於MSDN here非常類似的問題,並最終用下面的黑客來解決它自己;

保存的下的本地副本:\程序文件(x86)\微軟的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做了第一樂根據當前位置之後的下一個項目進行搜索。請注意,需要檢查上述黑客行爲,以便日後對功能區庫的更新進行檢查,並且一旦在庫中正確實施,就應該將其丟棄。