可以自动匹配已添加字符串的ComboBox

源文件
   
   
  1. DYNAMIC(CLJCComboBox, CComboBox)
  2. CLJCComboBox::CLJCComboBox()
  3. : m_bAutoComplete(FALSE)
  4. {
  5. }
  6. CLJCComboBox::~CLJCComboBox()
  7. {
  8. }
  9. BEGIN_MESSAGE_MAP(CLJCComboBox, CComboBox)
  10. ON_CONTROL_REFLECT(CBN_EDITCHANGE, &CLJCComboBox::OnCbnEditchange)
  11. ON_WM_CHAR()
  12. ON_CONTROL_REFLECT(CBN_DROPDOWN, &CLJCComboBox::OnCbnDropdown)
  13. END_MESSAGE_MAP()
  14. // CLJCComboBox message handlers
  15. void CLJCComboBox::OnCbnEditchange()
  16. {
  17. CString line; // partial line entered by user
  18. CString sMatchedText; // holds full line from list
  19. // get the text from the user input
  20. GetWindowText(line);
  21. int iHiLightStart = line.GetLength();
  22. // if the line is empty
  23. if(line.GetLength() == 0)
  24. {
  25. // 关闭下拉框
  26. ShowDropDown(FALSE);
  27. // empty the selection
  28. SetWindowText(_T(""));
  29. m_bAutoComplete = true;
  30. return;
  31. }
  32. // 这里处理删除操作的逻辑
  33. if(!m_bAutoComplete)
  34. {
  35. m_bAutoComplete = true;
  36. return;
  37. }
  38. // 开始匹配用户输入
  39. int m_iSelectedRow = FindString(-1, line);
  40. if(m_iSelectedRow >= 0)
  41. {
  42. // 打开下拉框
  43. ShowDropDown(TRUE);
  44. // 注意这里一定要使用postmessage以保证下拉框的选项被选中!
  45. PostMessage(CB_SETCURSEL, m_iSelectedRow, 0);
  46. //使用SendMessage 在Unicode对话框工程里正常,在多字节单文档工程里下拉框
  47. //选项不会被选中 SetCurSel同样也是
  48. //SendMessage(CB_SETCURSEL, m_iSelectedRow, 0);
  49. //SetCurSel(m_iSelectedRow);
  50. }
  51. // 接下来处理匹配失败
  52. else
  53. {
  54. ShowDropDown(FALSE);
  55. SetWindowText(line);
  56. }
  57. // 最后我们要高亮自动匹配的部分,以方便用户继续编辑,同样的要用异步消息发送
  58. PostMessage(CB_SETEDITSEL, 0, MAKELPARAM(iHiLightStart, -1));
  59. //使用SendMessage 在Unicode对话框工程里正常,在多字节单文档工程里
  60. //会选中所有文本 SetCurSel同样也是
  61. //SendMessage(CB_SETEDITSEL, 0, MAKELPARAM(iHiLightStart, -1));
  62. //SetEditSel(iHiLightStart,-1);
  63. }
  64. BOOL CLJCComboBox::PreTranslateMessage(MSG* pMsg)
  65. {
  66. if(pMsg->message==WM_KEYDOWN)
  67. {
  68. m_bAutoComplete=true;
  69. int nVirtKey=(int)pMsg->wParam;
  70. if(nVirtKey==VK_DELETE||nVirtKey==VK_BACK)
  71. m_bAutoComplete=false;
  72. }
  73. return CComboBox::PreTranslateMessage(pMsg);
  74. }
  75. void CLJCComboBox::OnCbnDropdown()
  76. {
  77. SetCursor(LoadCursor(NULL, IDC_ARROW)); //避免下拉框打开后鼠标消失
  78. }
头文件
   
   
  1. #pragma once
  2. // CLJCComboBox
  3. class CLJCComboBox : public CComboBox
  4. {
  5. DECLARE_DYNAMIC(CLJCComboBox)
  6. public:
  7. CLJCComboBox();
  8. virtual ~CLJCComboBox();
  9. protected:
  10. DECLARE_MESSAGE_MAP()
  11. public:
  12. afx_msg void OnCbnEditchange();
  13. afx_msg void OnChar(UINT nChar, UINT nRepCnt, UINT nFlags);
  14. virtual BOOL PreTranslateMessage(MSG* pMsg);
  15. private:
  16. BOOL m_bAutoComplete;
  17. public:
  18. afx_msg void OnCbnDropdown();
  19. };
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值