我想使编辑框响应鼠标单击,于是从CEdit派生了一个类CSubEdit,然后用vc向导为该类重载了单击消息处理函数OnLButtonDown,但是发现,如果在该函数中调用MessageBox("aa");之类的函数,就会点击父对话框的任何位置都会调用CEdit类的OnLButtonDown,也就是会不停的调用MessageBox("aa");请问这是为什么?
  代码如下:
   void CSubEdit::OnLButtonDown(UINT nFlags, CPoint point) 
{
// TODO: Add your message handler code here and/or call default
//CDialog dlg(IDD_DIALOG1);
//dlg.DoModal();
MessageBox("aa");
CEdit::OnLButtonDown(nFlags, point);
}

解决方案 »

  1.   

    "然后用vc向导为该类重载了单击消息处理函数OnLButtonDown"为哪个类重载呢?父类还是子类?看上去像父类重载。
      

  2.   

     把你的BEGIN_MESSAGE_MAP(...)发过来看看
      

  3.   

    是重载了子类的OnLButtonDown。这是源码:
    BEGIN_MESSAGE_MAP(CSubEdit, CEdit)
    //{{AFX_MSG_MAP(CSubEdit)
    ON_WM_LBUTTONDOWN()
    //}}AFX_MSG_MAP
    END_MESSAGE_MAP()
      

  4.   

    过滤掉不在自己窗口内的点击。
     CRect rc;
    GetClientRect(&rc);
    if (rc.PtInRect(point))
    AfxMessageBox(...);
      

  5.   

    就写在void CSubEdit::OnLButtonDown(UINT nFlags, CPoint point) 
      

  6.   


    恩我明白了,但是这样做还有一个小问题,就是关闭了AfxMessageBox(...); 之后,鼠标的光标形状移到CSubEdit之外,仍然是"I"的形状,必须得再点击一次才会变回箭头形状
      

  7.   

    void CMyEdit::OnLButtonDown(UINT nFlags, CPoint point) 
    {
    // TODO: Add your message handler code here and/or call default
    AfxMessageBox("aaa");
    CEdit::OnLButtonDown(nFlags, point);
    }
    把CEdit::OnLButtonDown(nFlags, point);注释掉就可以了
      

  8.   

    这是因为焦点在Edit上的缘故,你可以试一下,如果焦点不在Edit上,不不会弹出对话框了。
      

  9.   


    "把CEdit::OnLButtonDown(nFlags, point);注释掉就可以了"我就是这么改的,但是不知道这么改的原理是什么,CEdit::OnLButtonDown(nFlags, point);都作了什么?
      

  10.   

    我一开始也这么想,可是不行,你怎么试的?我用Tab建把焦点移调还是不行