zoukankan      html  css  js  c++  java
  • Auto Completion ComboBox for WTL

    原文:http://www.codeproject.com/Articles/4785/Auto-Completion-ComboBox-for-WTL

    发现原程序有一个问题,ComboBox本身无法截获PreTranslateMessage。

    为了要获取键盘按下的消息,可以从ComboBox里面的Edit下手,获取Edit的WM_KEYDOWN消息,再交给Edit的父窗口ComboBox处理。代码:

      1: //*************************************************************************
    
      2: //
    
      3: // Copyright (C), 2009-2010, Handy Information Co.,Ltd,All Rights Reserved
    
      4: //
    
      5: // FileName:      AutoComboBox.h  
    
      6: // Author:        yinxf
    
      7: // Date:          2012/2012/3
    
      8: // Description:   自动完成ComboBox
    
      9: // Function List:  
    
     10: // History:              
    
     11: //          <author>        <time>           <desc>        
    
     12: //            yinxf          2010/07/13        Build
    
     13: //
    
     14: //*************************************************************************
    
     15: #pragma once
    
     16: 
    
     17: class CAutoComboBox
    
     18:     : public CWindowImpl<CAutoComboBox, CComboBox>
    
     19: {
    
     20: public:
    
     21:     DECLARE_WND_SUPERCLASS(_T("AutoComboBox"), GetWndClassName())
    
     22: 
    
     23:     CAutoComboBox(void)
    
     24:         : m_Edit(this, 1)// 调用CContainedWindowT构造函数,告诉CEdit处理ALT_MSG_MAP的1小节
    
     25:         , m_bAutoComplete(TRUE)
    
     26:     {
    
     27:     }
    
     28:     ~CAutoComboBox(void){}
    
     29: 
    
     30: protected:
    
     31:     BEGIN_MSG_MAP(CAutoComboBox)
    
     32:         REFLECTED_COMMAND_CODE_HANDLER_EX(CBN_EDITUPDATE, OnEditUpdate) 
    
     33:         DEFAULT_REFLECTION_HANDLER()
    
     34:     ALT_MSG_MAP(1)      // 添加ALT_MSG_MAP消息处理
    
     35:         MESSAGE_HANDLER(WM_KEYDOWN, OnKeyDown)
    
     36:     END_MSG_MAP()
    
     37:     
    
     38:     BOOL SubclassWindow(HWND hWnd)
    
     39:     {
    
     40:         POINT pt;
    
     41:         pt.x = 3; 
    
     42:         pt.y = 3; 
    
     43:         HWND hwndEdit = ::ChildWindowFromPoint(hWnd , pt); 
    
     44:         m_Edit.SubclassWindow( hwndEdit );  // 将变量与CEdit控件关联
    
     45: 
    
     46:         BOOL bRet = __super::SubclassWindow(hWnd);
    
     47:         return bRet;
    
     48:     }
    
     49: 
    
     50:     // CBN_EDITUPDATE 输入框中内容被更新
    
     51:     LRESULT OnEditUpdate(UINT uNotifyCode, int nID, CWindow wndCtl)
    
     52:     {
    
     53:         if (!m_bAutoComplete) 
    
     54:             return 0;
    
     55: 
    
     56:         CString str;
    
     57:         GetWindowText(str);
    
     58:         int nLength = str.GetLength();
    
     59: 
    
     60:         // Currently selected range
    
     61:         DWORD dwCurSel = GetEditSel();
    
     62:         WORD dStart = LOWORD(dwCurSel); // 编辑控件中选中的字符串中起始位置
    
     63:         WORD dEnd   = HIWORD(dwCurSel); // 紧接着选中的字符串的第一个字符的位置
    
     64: 
    
     65:         // Search for, and select in, and string in the combo box that is prefixed
    
     66:         // by the text in the edit box
    
     67:         // 从列表开始查找并选中包含指定字符串的行
    
     68:         if ( SelectString(-1, str) == CB_ERR )
    
     69:         {
    
     70:             SetWindowText(str);        // No text selected, so restore what was there before
    
     71:             if (dwCurSel != CB_ERR)
    
     72:                 SetEditSel(dStart, dEnd);    //restore cursor postion
    
     73:         }
    
     74: 
    
     75:         // Set the text selection as the additional text that we have added
    
     76:         if ( dEnd < nLength && dwCurSel != CB_ERR )
    
     77:             SetEditSel(dStart, dEnd);
    
     78:         else
    
     79:             SetEditSel(nLength, -1);
    
     80: 
    
     81:         SetMsgHandled(FALSE);
    
     82:         return 0;
    
     83:     }
    
     84: 
    
     85:     // Need to check for backspace/delete. These will modify the text in
    
     86:     // the edit box, causing the auto complete to just add back the text
    
     87:     // the user has just tried to delete. 
    
     88:     LRESULT OnKeyDown(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled)
    
     89:     {
    
     90:         m_bAutoComplete = TRUE;
    
     91: 
    
     92:         if ( wParam == VK_DELETE || wParam == VK_BACK )
    
     93:         {
    
     94:             m_bAutoComplete = FALSE;
    
     95:         }
    
     96: 
    
     97:         bHandled = FALSE;
    
     98:         return 0;
    
     99:     }
    
    100: 
    
    101: protected:
    
    102:     BOOL m_bAutoComplete;
    
    103:     CContainedWindowT<CEdit> m_Edit;        // CContainedWindow包容器窗口, 在控件的父窗口中处理控件的消息
    
    104: };
    微信号:yinxufeng503
    本博客文章,有原创和网络搜集,转载请注明出处

    分享到: 更多
  • 相关阅读:
    软件原则
    Optional
    雪花算法原理
    AOP
    trycatchfinally
    lambda表达式
    BeanUtils属性转换工具
    @Transactional 失效
    用户线程&&守护线程
    卡顿问题
  • 原文地址:https://www.cnblogs.com/yinxufeng/p/2575575.html
Copyright © 2011-2022 走看看