1:对于一个父窗体上的所有子控件的消息为什么接收总是不到,如1000000个EDIT,我想要处理这1000000个EDIT的WM_MOUSEMOVE消息,下面的宏理论应该是可以的为什么实际总是不行,ON_CONTROL(WM_MOUSEMOVE,ID,MEMBERFUN),因为ID号是不同的它应该是可以找到MEMBERFUN,可为什么找不这个MEMBERFUN函数,而且在EDIT失去焦点时倒是进入了这个MEMBERFUN,天啊这是怎么回事.2:别告诉我用什么重载继承等等,因为我对EDIT只处理WM_MOUSEMOVE这一个消息还要重载的,哪我父窗体上还有LISTBOX,COMBOBOX,STATICT等等这样的1000000个不同类的
控件,每个我现在只处理一个在CLASSWizard不能影射的消息,如果要继承的话你有耐心对这1000000个不同的类都重栽一下吗?
请问怎么办?

解决方案 »

  1.   

    1,你不可能创建如1000000个EDIT,系统没有那么多空余的ID让你用
    2,你必须重栽CEdit类为CEditEx等,再为你的Edit创建CEditEx的DDX变量即可解决
      

  2.   

    ON_COMMAND_RANGE( id1, id2, memberFxn )
    Use this macro to map a contiguous range of command IDs to a single message handler function
      

  3.   

    to studentforever:
    我说了这个控件是不同类的哪当然MEMBERFXN肯定是不同的消息映射,ID1,ID2怎能在一个函数里呢?
      

  4.   

    to studentforever:
    我说了这1000个控件是不同类的哪当然MEMBERFXN肯定是不同的消息映射,ID1,ID2怎能在一个函数里呢?
     简单地请问各位高手,EDIT的MOUSEMOVE消息为什么检测不到,为什么,为什么,为什么??
      

  5.   

    csdn确实是没有高手。版主在哪,这么一个简单的问题。请给我讲解一下,EDIT在一个父窗体中为什么不能接收不到WM_MOUSEMOVE消息的
    原因?
      

  6.   

    不同类型,我知道了。
    你试试SetWindowLong()//Do the subclassing
      

  7.   

    EDIT在一个父窗体中为什么不能接收不到WM_MOUSEMOVE消息的
    原因?
    EDIT也是一个窗口,有它自己的窗口类和自己的窗口过程(系统提供了),所以属于EDIT的普通的WM_XXX类型的消息都由EDIT自己的窗口过程处理了,并不会发送到父窗口。不过EDIT的窗口过程在处理了某些消息后(如WM_LBUTTONWOND和WM_LBUTTONUP)后会发送WM_COMMAND形式的通知消息给它的父窗口(如XX_CLICKED)
      

  8.   

    to ruihuahan:不知道你用过VB,DELPHI没有,它们为什么可以让父窗体的EDIT接收WM_MOUSEMOVE消息,难道VC还不行吗?
    对于EDIT我用下面的宏映射
     ON_CONTROL(WM_MOUSEMOVE,ID,MEMBERFUN)我一执行程序,鼠标移进移出EDIT成员函数MEMBERFUN是不会执行的,可是当EDIT失去焦点时,成员函数MEMBERFUN确被执行了。这是为什么?你不是说对于WM_XXX类型的消息都由EDIT自己的窗口过程处理了,这里父窗体为什么能接收呢请继续指教。
      

  9.   

    你如果不用继承类而用MFC基类的话,那你一般是很难改变他的消息映射的,除了CLASSWIZARD提供给你的少数几个(如 ONCLICK等)以外。另外,你的假设也有点不合情理,如过真的有那么一天你的程序要处理1000000个EDIT的话,那我相信你的公司早就已经打败微软了,那我建议你自己开发一个编译器得了,还用什么VC呢?
      

  10.   

    1000000个EDIT?1.用来干什么要这么做?
    2.我在WIN98SE下试了,3000个EDIT系统就不行了,不得不重新起动。这么多EDIT你应该在需要时才动态创建。反正它又无法全部同时显示出来。要不在WIN9X下是没那么多资源给你用的。
      

  11.   

    你不要试图创建太多的EDIT,这样的编程方式是错误的。
      

  12.   

    to 上面的朋友:我是假设哪么多,是为了防止有人这么回答我;
    BOOL CMAINDlg::PreTranslateMessage(MSG* pMsg) 
    {
    if (pMsg->hwnd==GetDlgItem(IDC_EDIT1)->GetSafeHwnd() &&  pMsg->message==WM_CHAR
       
    return CDialog::PreTranslateMessage(pMsg);
    }
    看来我有点怀疑你们写过程序吗,你们别是什么什么研究生吧。
      

  13.   

    当你的EDIT很多时,你可以考虑这样:在父窗体上创建很多对应的区域,这样在父窗的WM_MOUSEMOVE中就可以处理你想要的消息。当需要在某区域写东西时,则处理LBUTTONDOWN消息,在该区域动态创建一个EDIT。这样你整个就只需要一个EDIT。