现有程序A和程序B.程序A上有一个PageControl.现在要运行B并且将B的窗口嵌入A成为A中PageControl的一个tab页.注意:有以下限制的条件,不是简单的用setparent实现父子关系融合.条件如下:
1.A和B不能是父子关系,必须拥有独立的消息处理机制,当B出现消息无法响应的时候不能影响A.也就是说.A和B都必须是顶级窗口.
2.如果用假界面的话,要求A在作出移动或者改变大小的时候,B的界面能完美适应tab页.
3.要求去掉B的标题栏,并不能在任务栏显示.如果嫌分不够还可以再加.也可以大家讨论.
本来准备给200分的,由于我只能开100分的帖子,等有满意答案,我再开新帖加分.只能浪费下CSDN的资源了.

解决方案 »

  1.   

    用鼠标获取任意窗口的句柄, 并把它当作"干儿子"
    http://www.cnblogs.com/del/archive/2008/03/09/1097793.html
      

  2.   


    这个例程的关键代码在这.Windows.SetParent(h, Self.Handle);
    还是用的SetParent.这不是我想要的.谢谢.
      

  3.   

    当B出现消息无法响应的时候不能影响A,Lz这个需求有点怪,是想做多线程,硬件处理还是大循环呢?
    去掉标题栏简单修改窗体style就可以,如果是其他进程的记得需要setwindowlong来实现,不过很久不用了,忘记了,问问百度吧
    任务栏不显示,只要是同一进程内创建的窗体就不会显示任务栏,如果是新的exe的话同样是setwindowlong很简单要求A在作出移动或者改变大小的时候,B的界面能完美适应tab页,这个可以修改a form的resize之类的方法,然后给b窗体发送窗体消息来修改对方的发小和位置,不过代码量不少
      

  4.   


    谢谢这位朋友的回复.其实第3个条件只是顺带加上的.代码我已经实现了.
    第2个条件还需要截获窗体移动消息.WM_NCHITTEST 
      

  5.   

    你不用SetParent,是因为限制条件1吗?
    这两个没有什么直接关系,两个UI进程,各自的消息队列是独立的。
      

  6.   

      public
           OldProc, NewProc: Pointer;
           procedure NewButtonMsg(var Msg: TMessage);
    end;
    procedure TFormMaina.NewButtonMsg(var Msg: TMessage);begin
     
        if (Msg.Msg = WM_NCHITTEST) then //消息处理
        begin
        end;
        Msg.Result := CallWindowProc(OldProc, Self.Handle, Msg.msg, msg.wParam, msg.lParam);
    end;procedure TFormMaina.FormCreate(Sender: TObject);
    begin
        NewProc := Pointer(LongInt(MakeObjectInstance(NewButtonMsg)));
        OldProc := Pointer(SetWindowLong(Self.Handle, GWL_WNDPROC, LongInt(NewProc)));
    end;
      

  7.   

    多谢这位朋友的代码,呵呵,其实这个消息我已经截获了,只是那个回复是补充funxu 的思路.
      

  8.   

    去掉标题 你看这个行不行?
          SetWindowLong(Application.Handle, GWL_EXSTYLE, WS_EX_TOOLWINDOW);
          SetWindowLong(Self.Handle, GWL_EXSTYLE, WS_EX_TOOLWINDOW);
      

  9.   

    楼主,看看我的场景是不是符合你的要求:有A、B、C、D、E、F六个独立的程序,其中A作为主框架,调用其他5个程序,分别嵌入在A程序主界面的
    pageControl的TAB中。当B嵌入时,此时A照样可以再点击运行其他独立的程序并嵌入到A中。如果,此时有一
    消息通知B程序自动关闭,则B收到消息自动关闭退出,如果A程序退出前,发一个消息通知嵌入在A中的其
    他程序关闭,则其他程序先关闭退出,最后A关闭。如果认为相似,那我们再进一步探讨。
      

  10.   

    唉.delphi真的末路了.结贴走人.
      

  11.   

    我也碰到楼主的问题了,setparent的坏处就在于子窗体死了,主窗体也死