ComboBoxEx.cpp
上传用户:qzzxgm
上传日期:2009-12-14
资源大小:1882k
文件大小:2k
源码类别:

书籍源码

开发平台:

Visual C++

  1. #include "stdafx.h"
  2. #include "ComboBoxEx.h"
  3. #ifdef _DEBUG
  4. #define new DEBUG_NEW
  5. #undef THIS_FILE
  6. static char THIS_FILE[] = __FILE__;
  7. #endif
  8. /////////////////////////////////////////////////////////////////////////////
  9. // CAutoComplete
  10. CAutoComplete::CAutoComplete()
  11. {
  12. m_bAutoComplete = TRUE;
  13. }
  14. CAutoComplete::~CAutoComplete()
  15. {
  16. }
  17. BEGIN_MESSAGE_MAP(CAutoComplete, CComboBox)
  18. //{{AFX_MSG_MAP(CAutoComplete)
  19. ON_CONTROL_REFLECT(CBN_EDITUPDATE, OnEditUpdate)
  20. //}}AFX_MSG_MAP
  21. END_MESSAGE_MAP()
  22. /////////////////////////////////////////////////////////////////////////////
  23. // CAutoComplete message handlers
  24. //处理消息循环
  25. BOOL CAutoComplete::PreTranslateMessage(MSG* pMsg)
  26. {
  27. //捕捉按键消息
  28. if (pMsg->message == WM_KEYDOWN)
  29. {
  30. m_bAutoComplete = TRUE;
  31. int nVirtKey = (int) pMsg->wParam;
  32. if (nVirtKey == VK_DELETE || nVirtKey == VK_BACK)
  33. m_bAutoComplete = FALSE;
  34. }
  35. return CComboBox::PreTranslateMessage(pMsg);
  36. }
  37. //编辑框更新消息
  38. void CAutoComplete::OnEditUpdate() 
  39. {
  40.   if (!m_bAutoComplete) 
  41.       return;
  42.   //获得编辑框的字符串
  43.   CString str;
  44.   GetWindowText(str);
  45.   int nLength = str.GetLength();
  46.   
  47.   //当前选择范围
  48.   DWORD dwCurSel = GetEditSel();
  49.   WORD dStart = LOWORD(dwCurSel);
  50.   WORD dEnd   = HIWORD(dwCurSel);
  51.   //在列表框中搜索与编辑框中匹配的字符串,然后使其被选择
  52.   if (SelectString(-1, str) == CB_ERR)
  53.   {
  54.       SetWindowText(str);
  55.       if (dwCurSel != CB_ERR)
  56.         SetEditSel(dStart, dEnd);
  57.   }
  58.   if (dEnd < nLength && dwCurSel != CB_ERR)
  59.       SetEditSel(dStart, dEnd);
  60.   else
  61.       SetEditSel(nLength, -1);
  62. }