ComboBoxEx.cpp
上传用户:hbjdyb2005
上传日期:2021-01-26
资源大小:168k
文件大小:3k
源码类别:

组合框控件

开发平台:

Visual C++

  1. // ComboBoxEx.cpp : implementation file
  2. //
  3. // Autocompleting combo-box (like the URL edit box in netscape)
  4. //
  5. // Written by Chris Maunder (Chris.Maunder@cbr.clw.csiro.au)
  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. // The author accepts no liability if it causes any damage to your
  18. // computer, causes your pet cat to fall ill, increases baldness or
  19. // makes you car start emitting strange noises when you start it up.
  20. //
  21. // Expect bugs.
  22. // 
  23. // Please use and enjoy. Please let me know of any bugs/mods/improvements 
  24. // that you have found/implemented and I will fix/incorporate them into this
  25. // file. 
  26. //
  27. // Modified: 12 Sep 1998 Setting correct cursor position after 
  28. //                       auto-complete: Petr Stejskal and Ryan Schneider
  29. //
  30. // 本代码供免费使用,使用时请遵守如上协定
  31. /////////////////////////////////////////////////////////////////////////////
  32. #include "stdafx.h"
  33. #include "ComboBoxEx.h"
  34. #ifdef _DEBUG
  35. #define new DEBUG_NEW
  36. #undef THIS_FILE
  37. static char THIS_FILE[] = __FILE__;
  38. #endif
  39. /////////////////////////////////////////////////////////////////////////////
  40. // CComboBoxExt
  41. CComboBoxExt::CComboBoxExt()
  42. {
  43. m_bAutoComplete = TRUE;
  44. }
  45. CComboBoxExt::~CComboBoxExt()
  46. {
  47. }
  48. BEGIN_MESSAGE_MAP(CComboBoxExt, CComboBox)
  49. //{{AFX_MSG_MAP(CComboBoxExt)
  50. ON_CONTROL_REFLECT(CBN_EDITUPDATE, OnEditUpdate)
  51. //}}AFX_MSG_MAP
  52. END_MESSAGE_MAP()
  53. /////////////////////////////////////////////////////////////////////////////
  54. // CComboBoxExt message handlers
  55. BOOL CComboBoxExt::PreTranslateMessage(MSG* pMsg)
  56. {
  57. // Need to check for backspace/delete. These will modify the text in
  58. // the edit box, causing the auto complete to just add back the text
  59. // the user has just tried to delete. 
  60. if (pMsg->message == WM_KEYDOWN)
  61. {
  62. m_bAutoComplete = TRUE;
  63. int nVirtKey = (int) pMsg->wParam;
  64. if (nVirtKey == VK_DELETE || nVirtKey == VK_BACK)
  65. m_bAutoComplete = FALSE;
  66. }
  67. return CComboBox::PreTranslateMessage(pMsg);
  68. }
  69. void CComboBoxExt::OnEditUpdate() 
  70. {
  71. // if we are not to auto update the text, get outta here
  72. if (!m_bAutoComplete) 
  73. return;
  74. // Get the text in the edit box
  75. CString str;
  76. GetWindowText(str);
  77. int nLength = str.GetLength();
  78. // Currently selected range
  79. DWORD dwCurSel = GetEditSel();
  80. WORD dStart = LOWORD(dwCurSel);
  81. WORD dEnd   = HIWORD(dwCurSel);
  82. // Search for, and select in, and string in the combo box that is prefixed
  83. // by the text in the edit box
  84. if (SelectString(-1, str) == CB_ERR)
  85. {
  86. SetWindowText(str); // No text selected, so restore what was there before
  87. if (dwCurSel != CB_ERR)
  88. SetEditSel(dStart, dEnd); //restore cursor postion
  89. }
  90. // Set the text selection as the additional text that we have added
  91. if (dEnd < nLength && dwCurSel != CB_ERR)
  92. SetEditSel(dStart, dEnd);
  93. else
  94. SetEditSel(nLength, -1);
  95. }