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
    本博客文章,有原创和网络搜集,转载请注明出处

    分享到: 更多
  • 相关阅读:
    杭电 Problem
    杭电Problem 5053 the sum of cube 【数学公式】
    杭电 Problem 2089 不要62 【打表】
    杭电 Problem 4548 美素数【打表】
    杭电 Problem 2008 分拆素数和 【打表】
    杭电 Problem 1722 Cake 【gcd】
    杭电 Problem 2187 悼念512汶川大地震遇难同胞——老人是真饿了【贪心】
    杭电Problem 1872 稳定排序
    杭电 Problem 1753 大明A+B
    东北林业大 564 汉诺塔
  • 原文地址:https://www.cnblogs.com/yinxufeng/p/2575575.html
Copyright © 2011-2022 走看看