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

组合框控件

开发平台:

Visual C++

  1. // AutoCompletionComboBox.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "AutoCompletionComboBox.h"
  5. #ifdef _DEBUG
  6. #define new DEBUG_NEW
  7. #undef THIS_FILE
  8. static char THIS_FILE[] = __FILE__;
  9. #endif
  10. /////////////////////////////////////////////////////////////////////////////
  11. // CAutoCompletionComboBox
  12. CAutoCompletionComboBox::CAutoCompletionComboBox()
  13. : CComboBox(),
  14.   m_pEdit(NULL)
  15. {
  16. }
  17. CAutoCompletionComboBox::~CAutoCompletionComboBox()
  18. {
  19. }
  20. BEGIN_MESSAGE_MAP(CAutoCompletionComboBox, CComboBox)
  21. //{{AFX_MSG_MAP(CAutoCompletionComboBox)
  22. // NOTE - the ClassWizard will add and remove mapping macros here.
  23. //}}AFX_MSG_MAP
  24. END_MESSAGE_MAP()
  25. /////////////////////////////////////////////////////////////////////////////
  26. // CAutoCompletionComboBox message handlers
  27. void CAutoCompletionComboBox::HandleCompletion()
  28. {
  29.   // Make sure we can 'talk' to the edit control
  30.   if ( m_pEdit == NULL )  
  31.   {
  32.     m_pEdit = new CEdit();
  33.     m_pEdit->SubclassWindow(GetDlgItem(1001)->GetSafeHwnd());
  34.   }
  35.   // Save the state of the edit control
  36.   CString windowtext;
  37.   m_pEdit->GetWindowText(windowtext);
  38.   int start,end;
  39.   m_pEdit->GetSel(start,end);
  40.   // Perform actual completion
  41.   int bestindex = -1;
  42.   int bestfrom  = INT_MAX;
  43.   for ( int x = 0; x < GetCount(); x++ )
  44.   {
  45.     CString s;
  46.     GetLBText(x,s);
  47.     int from = s.Find(windowtext);
  48.     if ( from != -1 && from < bestfrom )
  49.     {
  50.       bestindex = x;
  51.       bestfrom  = from;
  52.     }
  53.   }
  54.   if ( bestindex != -1 && GetCurSel() != bestindex )
  55.   {
  56.     // Select the matching entry in the list
  57.     ShowDropDown(TRUE);
  58.     SetCurSel(bestindex);
  59.     // Restore the edit control
  60.     m_pEdit->SetWindowText(windowtext);
  61.     m_pEdit->SetSel(start,end);
  62.   }
  63. }
  64. BOOL CAutoCompletionComboBox::OnCommand(WPARAM wParam, LPARAM lParam) 
  65. {
  66.   if ( HIWORD(wParam) == EN_CHANGE )
  67.   {
  68.     HandleCompletion();
  69.     return true;
  70.   }
  71. return CComboBox::OnCommand(wParam, lParam);
  72. }