现有程序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.A和B不能是父子关系,必须拥有独立的消息处理机制,当B出现消息无法响应的时候不能影响A.也就是说.A和B都必须是顶级窗口.
2.如果用假界面的话,要求A在作出移动或者改变大小的时候,B的界面能完美适应tab页.
3.要求去掉B的标题栏,并不能在任务栏显示.如果嫌分不够还可以再加.也可以大家讨论.
本来准备给200分的,由于我只能开100分的帖子,等有满意答案,我再开新帖加分.只能浪费下CSDN的资源了.
http://www.cnblogs.com/del/archive/2008/03/09/1097793.html
这个例程的关键代码在这.Windows.SetParent(h, Self.Handle);
还是用的SetParent.这不是我想要的.谢谢.
去掉标题栏简单修改窗体style就可以,如果是其他进程的记得需要setwindowlong来实现,不过很久不用了,忘记了,问问百度吧
任务栏不显示,只要是同一进程内创建的窗体就不会显示任务栏,如果是新的exe的话同样是setwindowlong很简单要求A在作出移动或者改变大小的时候,B的界面能完美适应tab页,这个可以修改a form的resize之类的方法,然后给b窗体发送窗体消息来修改对方的发小和位置,不过代码量不少
谢谢这位朋友的回复.其实第3个条件只是顺带加上的.代码我已经实现了.
第2个条件还需要截获窗体移动消息.WM_NCHITTEST
这两个没有什么直接关系,两个UI进程,各自的消息队列是独立的。
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;
SetWindowLong(Application.Handle, GWL_EXSTYLE, WS_EX_TOOLWINDOW);
SetWindowLong(Self.Handle, GWL_EXSTYLE, WS_EX_TOOLWINDOW);
pageControl的TAB中。当B嵌入时,此时A照样可以再点击运行其他独立的程序并嵌入到A中。如果,此时有一
消息通知B程序自动关闭,则B收到消息自动关闭退出,如果A程序退出前,发一个消息通知嵌入在A中的其
他程序关闭,则其他程序先关闭退出,最后A关闭。如果认为相似,那我们再进一步探讨。