鄙人刚学ATL,创建了一个基于Edit的控件,想过滤一些消息,确找不到应该在何处过滤,请高人指点下啊,感激不尽。

解决方案 »

  1.   

    BEGIN_MSG_MAP(CYourClass)   
        
      ALT_MSG_MAP(1)   
      MESSAGE_HANDLER(
    WM_GETDLGCODE,   OnGetDlgCode)   
      MESSAGE_HANDLER(WM_KEYDOWN,   onkeydown)   
      MESSAGE_HANDLER(
    WM_CHAR,   OnEditInputMagnification)   
        
      END_MSG_MAP()   
        
        
      .cpp     
      in   constructor:   CYourClass::CYourClass()   :   m_Edit(_T("EDIT"),   this,   1)   {}   
      in   OnInitDialog:   m_Edit.SubclassWindow(::GetWindow(GetDlgItem(IDC_COMBO),   GW_CHILD));   
        
      add   if   you   want   all   keys   add   following:   
        
      LRESULT   CYourClass::OnGetDlgCode(UINT   uMsg,   WPARAM   wParam,   LPARAM   lParam,   BOOL&   bHandled)   
      {   
      return   DLGC_WANTALLKEYS;   
      }   
        
        
      and   finally   you   can   get   KeyDown:   
        
      LRESULT   CYourClass::onkeydown(UINT   uMsg,   WPARAM   wParam,   LPARAM   lParam,   BOOL&   bHandled)   
      {   
      switch   (wParam)   
      {   
      case   VK_RETURN:   
      {   
      ...   
      }   
      break;   
      case   VK_TAB:   
      {   
      ...   
      }   
      break;   
      }   
        
      bHandled   =   FALSE;   
      return   S_OK;   
      }   
      

  2.   

    thank you very much,but as you know,Edit has a function,as DefWindowProc, I want to Overload that to do something like this:
    LRESULT CPsdEditCtrl::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam) 
    {
    // TODO: Add your specialized code here and/or call the base class
    if(message == WM_GETTEXT || message == EM_GETLINE || EM_SETPASSWORDCHAR)
    {
    if(TRUE == m_GetFlag)
    {
    return 0;
    }
    else
    {
    m_GetFlag = TRUE;
    return COleControl::DefWindowProc(message, wParam, lParam);
    }
    }
    else
    {
    return COleControl::DefWindowProc(message, wParam, lParam);
    }
    }
    Otherwise, if I build A Activex Control based edit,How I know which message it(means edit) answer or not?
      

  3.   

    I do as you told me:
    ALT_MSG_MAP(1)
    // Replace this with message map entries for superclassed Edit
    MESSAGE_HANDLER(WM_CHAR, OnChar)
    MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog)
    END_MSG_MAP() LRESULT OnChar(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
    {
    // TODO : Add Code for message handler. Call DefWindowProc if necessary.
    m_ctlEdit.DefWindowProc(WM_CHAR, wParam, lParam);
    return 0;
    } LRESULT OnInitDialog(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
    {
    // TODO : Add Code for message handler. Call DefWindowProc if necessary.
    m_ctlEdit.SubclassWindow(::GetWindow(GetDlgItem(IDC_HEDIT), GW_CHILD));
    MessageBox("a","b",MB_OK);
    return 0;
    }OnChar can work, but OnInitDialog cant work, why? Can you tell me?