我用MFC做一个控件,然后在这个控件中用CEDIT Create的方法创建一个CEDIT框,创建成功也显示出来,但是EDIT有些功能则没有实现 ,消息也捕捉不到,比如右键弹出菜单功能,CEDIT根本捕捉不到WM_RBUTTONDOWN等消息,但又可以输入。而且我在控件中重载PreTranslateMessage函数,发现控件的一些消息这个函数也捕捉不到,比如控件有WM_MOUSEMOVE消息,可以触发WM_MOUSEMOVE消息,但我在PreTranslateMessage设断点却没有捕捉到。
现在想请教高手:
1.为什么控件的PreTranslateMessage函数没法捕捉到WM_MOUSEMOVE等消息(有些消息又可以,我在迷个函数设了断点)?
2.怎样让CEDIT能够像一个正常的CEDIT一样?
谢谢!!解决后另开贴送100分!

解决方案 »

  1.   

    我就是从CEDIT派生类中,捕捉不到,请教高手!
      

  2.   

    需要高手吗?
    你是在容器里创建一个EDIT的吧?
    那当然收不到消息,因为消息都被你的容器收去了
    EDIT自己没有消息循环难道就不能输入东西了吗?
    让你的EDIT子类化就可以了,所有消息就都流进来了。
      

  3.   

    loveghb(温柔的毒药):
    在我看来,只要比我强的就是我贴中的高手,你会这个问题,我不会,那你就是我所谓的高手,所以没有贬低任何人的意思。
    请问你可以详细点吗?因为我在控件的PreTranslateMessage中设断点,也没法捕捉 一定的消息,Edit是放在控件中的。
      

  4.   

    loveghb(温柔的毒药):
    根据你的理解,我将EDIT子类化了,还是接受不到消息呀!!!!
      

  5.   

    继承CEdit,重载OnRButtonDown
    void CMyEdit::OnRButtonDown(UINT nFlags, CPoint point)
    {
        // TODO: 在此添加消息处理程序代码和/或调用默认值
        this->GetParent()->SendMessage(WM_RBUTTONDOWN, nFlags, point.y*65536+point.x);
        CEdit::OnRButtonDown(nFlags, point);
    }
      

  6.   

    楼上的,CEDIT的回调函数都收不到消息,CMyEdit::OnRButtonDown怎么能执行呢?我试了一下,不行。
      

  7.   

    xiaoyuzi(小鱼子):
    请问如何消息反射?
      

  8.   

    在向导里‘which window class, if any, should this control subclass’里选择EDIT,可以注意一下2种方式代码不同的地方,以后就可以自己加代码了。如果不是子类化,那EDIT是没有消息循环的,只有WM_COMMAND消息被其父窗口也就是你的容器收到,但是EDIT的化用消息反射有点麻烦。
    举个例子,需要做一个BUTTON的ActiveX控件,我用你的方法,会发现点BUTTON容器根本收不到WM_LBUTTONDOWN消息,那我做一个OnLick事件就没办法做出来了。容器永远不会收到WM_LBUTTONDOWN,因为客户区全被你的BUTTON占据了。消息反射也就是说当你的容器收到WM_COMMAND的时候去HIWORD(wParam)判断是否是BN_CLICKED,如果是,那就调用你的内部Click函数,去向外引发一个Click事件。
    明白了吗?我学VC也就1个多月,别急,我刚学COM几天,大家一起进步。
      

  9.   

    我的程序在VC.net2003下运行过的绝对没有问题
      

  10.   

    重载 COleControl::IsSubClassControl 函数 返回True
    You must override this function and return TRUE if your OLE control subclasses a Windows control
      

  11.   

    redcony() ( ) :
    重载 COleControl::IsSubClassControl 函数 返回True
    //
    也不管用呀!
      

  12.   

    BOOL CSampleCtrl::PreCreateWindow( CREATESTRUCT& cs )
    {
        cs.lpszClass = _T("EDIT");
        return COleControl::PreCreateWindow(cs);
    }
    BOOL CSampleCtrl::IsSubclassedControl( )
    {
        return TRUE;
    }
      

  13.   

    redcony() :
       谢谢你的热心,我想你没搞清楚,我是做一个控件,但这个控件大部份是我画的,只是在其中某处要用一个EDIT,不是把整个控件都变成EDIT的子类。不知这样你是否能解决?
      

  14.   

    天,你说了半天原来是这个意思啊?那你就派生一个CEDIT,响应你所需要的消息,动态创建,然后在OnDraw里安排你各个控件的位置。
    注意在OnDraw里MoveWindow的时候用GetSafeHwnd判断一下。
      

  15.   

    哦?????可能是我开始没讲清楚,不好意思了!!!!
    我现在就是派生了一个CEDIT,也知道要响应我需要的消息,可惜的是我要的消息不会到派生的CEDIT类中,也就是说派生的CEDIT捕捉不到一些消息(比如WM_RBUTTONDOWN),请问如何解决?
      

  16.   

    在容器内用NOTIFY_HANDLER宏捕捉到消息,然后调用CEdit类中自定义的消息处理函数即可
    一般地,只有OnClick收不到吧?
      

  17.   

    是这样的,我是做一个控件,这个控件不是标准控件的子类,而是我自己画的,但我在这个控件中要用到一个EDIT,所以我就派生了一个CEDIT:CMyEdit然后用它动态的生成了一个EDIT在我的控件中,可是这时我发现这个EDIT没有右键菜单等功能,于是我就去PreCreateWindow抓消息,可惜的是没有抓到(控件和CMYEDIT都试过),我现在奇怪的是控件的PreCreateWindow抓不到的消息,控件却可能可以触发,可是CMYEDIT却有很多消息抓不到。但是,后来我又发现,在弹出一个对话框后,EDIT又正常了,所以想请高手解决我这个问题!谢谢了!!!!
      

  18.   

    我是做一个控件,在控件中用到CEDIT,所以派生了一个CMYEDIT,动态在控件中生成EDIT,然后发现CMYEDIT一些消息捕捉不到,比如没有右键功能,而且PreCreateWindow也捕捉不到,比如:控件有一个WM_LBUTTONDOWN消息,PreCreateWindow捕捉不到,但是可以触发控件中的WM_LBUTTONDOWN对应的函数,后来我发现,在弹出一个对话框后,CMYEDIT又正常了。请教这如何解决?
      

  19.   

    我不用mfc做控件,所以我也不太清楚,如果是ATL,可以肯定cedit拿到的已经不是wm_xxx的消息了,atl会包装,但是我认为应该是一样的,是否可以在控件中响应wm_lbuttondown呢?如果可以,你就转调cedit中的函数就ok了啊
      

  20.   

    可是CEDIT是函数也不会触发呀,晕死。
      

  21.   

    这么说吧,我有做过一个控件,也是要自己画一个editbox,同样响应不到onclick,只能在控件中响应onclick然后调用editbox的onclick函数,我就只会这样而已
      

  22.   

    哦, 好了,算了,过了这么多天了,结贴了。
    郁闷ing .......