ComboEx.cpp
上传用户:geanq888
上传日期:2007-01-03
资源大小:316k
文件大小:2k
源码类别:

Ftp客户端

开发平台:

Visual C++

  1. // ComboEx.cpp : implementation file
  2. //
  3. // Copyright (c) Chris Maunder 1997.
  4. // Please feel free to use and distribute.
  5. #include "stdafx.h"
  6. #include "ComboEx.h"
  7. #ifdef _DEBUG
  8. #define new DEBUG_NEW
  9. #undef THIS_FILE
  10. static char THIS_FILE[] = __FILE__;
  11. #endif
  12. /////////////////////////////////////////////////////////////////////////////
  13. // CComboEx
  14. CComboEx::CComboEx()
  15. {
  16. m_bAutoComplete = TRUE;
  17. }
  18. CComboEx::~CComboEx()
  19. {
  20. }
  21. BEGIN_MESSAGE_MAP(CComboEx, CComboBox)
  22. //{{AFX_MSG_MAP(CComboEx)
  23. ON_CONTROL_REFLECT(CBN_EDITUPDATE, OnEditUpdate)
  24. //}}AFX_MSG_MAP
  25. END_MESSAGE_MAP()
  26. /////////////////////////////////////////////////////////////////////////////
  27. // CComboEx message handlers
  28. BOOL CComboEx::PreTranslateMessage(MSG* pMsg)
  29. {
  30. // Need to check for backspace/delete. These will modify the text in
  31. // the edit box, causing the auto complete to just add back the text
  32. // the user has just tried to delete. 
  33. if (pMsg->message == WM_KEYDOWN)
  34. {
  35. m_bAutoComplete = TRUE;
  36. int nVirtKey = (int) pMsg->wParam;
  37. if (nVirtKey == VK_DELETE || nVirtKey == VK_BACK)
  38. m_bAutoComplete = FALSE;
  39. }
  40. return CComboBox::PreTranslateMessage(pMsg);
  41. }
  42. /////////////////////////////////////////////////////////////////////////////
  43. void CComboEx::OnEditUpdate() 
  44. {
  45.   DWORD dwCurSel = GetEditSel();
  46.   int nStart = dwCurSel >> 16;
  47.   int nEnd = dwCurSel & 0xffff;
  48.   // if we are not to auto update the text, get outta here
  49. if (!m_bAutoComplete) return;
  50. // Get the text in the edit box
  51. CString str;
  52. GetWindowText(str);
  53. int nLength = str.GetLength();
  54. // Search for, and select in, and string in the combo box that is prefixed
  55. // by the text in the edit box
  56. if (SelectString(-1, str) == CB_ERR) 
  57. SetWindowText(str); // No text selected, so restore what was there before
  58. // Set the text selection as the additional text that we have added
  59.   if(nEnd < nLength)
  60.     SetEditSel(nStart, nEnd);
  61.   else
  62.     SetEditSel(nLength, -1);
  63. }
  64. /////////////////////////////////////////////////////////////////////////////