ComboCompletion.cpp
上传用户:hebinsheng
上传日期:2015-04-30
资源大小:25k
文件大小:3k
源码类别:

ICQ弱点检测代码

开发平台:

Visual C++

  1. // ComboCompletion.cpp : implementation file
  2. //
  3. // Autocompleting combo-box (like the URL edit box in netscape)
  4. //
  5. // Written by Chris Maunder (cmaunder@mail.com)
  6. // Copyright (c) 1998.
  7. //
  8. // This code may be used in compiled form in any way you desire. This
  9. // file may be redistributed unmodified by any means PROVIDING it is 
  10. // not sold for profit without the authors written consent, and 
  11. // providing that this notice and the authors name is included. If 
  12. // the source code in  this file is used in any commercial application 
  13. // then acknowledgement must be made to the author of this file 
  14. // (in whatever form you wish).
  15. //
  16. // This file is provided "as is" with no expressed or implied warranty.
  17. //
  18. // Expect bugs.
  19. // 
  20. // Please use and enjoy. Please let me know of any bugs/mods/improvements 
  21. // that you have found/implemented and I will fix/incorporate them into this
  22. // file. 
  23. //
  24. // Modified: 12 Sep 1998 Setting correct cursor position after 
  25. //                       auto-complete: Petr Stejskal and Ryan Schneider
  26. //
  27. /////////////////////////////////////////////////////////////////////////////
  28. #include "stdafx.h"
  29. #include "ComboCompletion.h"
  30. #ifdef _DEBUG
  31. #define new DEBUG_NEW
  32. #undef THIS_FILE
  33. static char THIS_FILE[] = __FILE__;
  34. #endif
  35. /////////////////////////////////////////////////////////////////////////////
  36. // CComboCompletion
  37. CComboCompletion::CComboCompletion()
  38. {
  39. m_bAutoComplete = TRUE;
  40. }
  41. CComboCompletion::~CComboCompletion()
  42. {
  43. }
  44. BEGIN_MESSAGE_MAP(CComboCompletion, CComboBox)
  45. //{{AFX_MSG_MAP(CComboCompletion)
  46. ON_CONTROL_REFLECT(CBN_EDITUPDATE, OnEditUpdate)
  47. //}}AFX_MSG_MAP
  48. END_MESSAGE_MAP()
  49. /////////////////////////////////////////////////////////////////////////////
  50. // CComboCompletion message handlers
  51. BOOL CComboCompletion::PreTranslateMessage(MSG* pMsg)
  52. {
  53. // Need to check for backspace/delete. These will modify the text in
  54. // the edit box, causing the auto complete to just add back the text
  55. // the user has just tried to delete. 
  56. if (pMsg->message == WM_KEYDOWN)
  57. {
  58. m_bAutoComplete = TRUE;
  59. int nVirtKey = (int) pMsg->wParam;
  60. if (nVirtKey == VK_DELETE || nVirtKey == VK_BACK)
  61. m_bAutoComplete = FALSE;
  62. }
  63. return CComboBox::PreTranslateMessage(pMsg);
  64. }
  65. void CComboCompletion::OnEditUpdate() 
  66. {
  67.   // if we are not to auto update the text, get outta here
  68.   if (!m_bAutoComplete) 
  69.       return;
  70.   // Get the text in the edit box
  71.   CString str;
  72.   GetWindowText(str);
  73.   int nLength = str.GetLength();
  74.   
  75.   // Currently selected range
  76.   DWORD dwCurSel = GetEditSel();
  77.   WORD dStart = LOWORD(dwCurSel);
  78.   WORD dEnd   = HIWORD(dwCurSel);
  79.   // Search for, and select in, and string in the combo box that is prefixed
  80.   // by the text in the edit box
  81.   if (SelectString(-1, str) == CB_ERR)
  82.   {
  83.       SetWindowText(str); // No text selected, so restore what was there before
  84.       if (dwCurSel != CB_ERR)
  85.         SetEditSel(dStart, dEnd); //restore cursor postion
  86.   }
  87.   // Set the text selection as the additional text that we have added
  88.   if (dEnd < nLength && dwCurSel != CB_ERR)
  89.       SetEditSel(dStart, dEnd);
  90.   else
  91.       SetEditSel(nLength, -1);
  92. }