只知道有三个相关消息:WM_MDICREATE,WM_MDIDESTROY,WM_MDIACTIVATE,这三个消息使用在子窗体中是可以拦截的,在主窗体中无效,我是这样写的。MESSAGE void __fastcall WMMDIActivate(TWMMDIActivate &msg);
BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(WM_MDIACTIVATE, TWMMDIActivate, WMMDIActivate)
END_MESSAGE_MAP(TForm)MESSAGE void __fastcall TForm1::WMMDIActivate(TWMMDIActivate &msg)
{
    ListBox1->Items->Add(ActiveMDIChild->Caption);
    TForm::Dispatch(&msg);
}

解决方案 »

  1.   

    我提供解决方案,不知道是否适合你:1、在主窗体里设置一个“侦听器”(可以用waitFor或管道等技术实现)2、在子窗体的那些事件发生时,“通知”主窗体的“侦听器”
      

  2.   

    在子窗口的OnCreate函数中,调用MDIParent成员指定函数就可以了,何必麻烦呢!每一个子窗口都应该知道自己的MDI父窗口是什么类型的,只要在父窗口中定义一个函数,然后子窗口在相应的事件到来的时候调用父窗口的方法就可以了。
      

  3.   

    在子窗口的OnCreate函数中,调用MDIParent成员指定函数就可以了,何必麻烦呢!每一个子窗口都应该知道自己的MDI父窗口是什么类型的,只要在父窗口中定义一个函数,然后子窗口在相应的事件到来的时候调用父窗口的方法就可以了。
      

  4.   

    子窗体是在dll中的,不能得到父窗口.To LuoGD:使用子窗体向父窗口发送自定义消息是可行的,但是比较麻烦.我的应该是可以实现的,因为Form的WindowMenu属性就是这样,子窗体中不需要任何处理,主窗体就可以添加菜单项.
      

  5.   

    谁说在DLL中就不能得到父窗口,除非DLL不是你自己写的,否则就能根据MDIParent得到父窗口
      

  6.   

    不是你自己写的,你跟LuoGD说:使用子窗体向父窗口发送自定义消息是可行的,但是比较麻烦.你说说怎么可行的,还说我说废话。
      

  7.   

    懒得跟你吵,好像有个WM_PARENTNOTIFY消息,帮助里说是有关子窗体的create和destroy的,不知道怎么用?
      

  8.   

    ----MainForm.h----BEGIN_MESSAGE_MAP
        VCL_MESSAGE_HANDLER(WM_PARENTNOTIFY, TMessage, OnParentNotify)
    END_MESSAGE_MAP(TForm)----MainForm.cpp----void __fastcall TMainFrm::OnParentNotify(TMessage & msg)
    {
        if (msg.WParamLo == WM_CREATE)
        {
            HWND hChild = (HWND)msg.LParamLo;
            // do your work
        }
    }
      

  9.   

    你可以使用重载ClientWindow消息处理过程:
    private:
    void __fastcall ClientProc(TMessage &msg);
    Pointer ClientObjInstance;
    LONG OldClientProc;void __fastcall TForm1::FormCreate(TObject *Sender)
    {
        ClientObjInstance = MakeObjectInstance(ClientProc);
        OldClientProc = SetWindowLong(ClientHandle,GWL_WNDPROC,(long)ClientObjInstance);
    }
    void __fastcall TForm1::FormClose(TObject *Sender)
    {
        SetWindowLong(ClientHandle,GWL_WNDPROC,OldClientProc);
        FreeObjectInstance(ClientObjInstance);
    }
    //下面函数用来讲子窗体列表加入到ListBox1中,记得在最后调用默认的ClientWindow处理过程
    void __fastcall TForm1::ClientProc(TMessage &msg)
    {
        if (msg.Msg == WM_PARENTNOTIFY) {
            if (msg.WParamLo == WM_CREATE) {
                TForm *r = (TForm *)(FindControl((HWND)msg.LParam));
                ListBox1->Items->AddObject(r->Caption,r);
            }
            else if (msg.WParamLo == WM_DESTROY) {
                TForm *r = (TForm *)(FindControl((HWND)msg.LParam));
                miListWindows->Items->Delete(miListWindows->Items->IndexOfObject(r));
            }
        }
        msg.Result = CallWindowProc((FARPROC)OldClientProc,
                                ClientHandle,msg.Msg,msg.WParam,msg.LParam);}WM_PARENTNOTIFY是子窗体向ClientWindow发送的消息,使用参数WParamLo判定事件,详情看帮助,如果使用WM_MDICREATE和WM_MDIDESTROY也是可以的,但是要注意调用默认过程CallWindowProc的顺序,因为WM_MDICREATE在处理之后才会返回子窗体句柄,而WM_MDIDESTROY则必须在处理之前使用它的WParam参数作为子窗体句柄.