可以,只要你把这个悬浮窗口的父窗口设置为当前桌面就可以。桌面也是个窗口。Public procedure Createparams(Var Params:TCreateParams);override;... procedure TFormDrop.Createparams(var Params:TCreateParams);begin Inherited CreateParams(Params); With Params do begin EXStyle:=ExStyle or WS_EX_TOPMOST OR WS_EX_ACCEPTFILES or WS_DLGFRAME wndParnet:=GetDesktopWindow; //关键一行,用SetParent都不行!! end;end;
to cgm: 这样可以吗?你的这个函数写在哪个窗体上阿?主窗体?还是第二个窗体,还是…… 要是主窗体设置成桌面,上面的控件都不显示了。我要达到的效果是: 两个子窗体b、c的都相对于主窗体a总在最前, 但是我现在希望其中的一个子窗体c,相对于另一个子窗体b也总在最前,不管焦点在哪个窗体上。但是对于其他的程序不是总在最前的。 (不考虑MDI方式,不能把一个窗体的Parent设置为另一个窗体,因为这样不符合需求)
TCreateParams.WndParent对应于CreateWindow的hWndParent参数 而这个参数对于层叠窗口而言只是表示它的Owner Window An owned window is an overlapped window that is destroyed when its owner window is destroyed or hidden when its owner is minimized; it is always displayed on top of its owner window. 只有WS_CHILD窗口的TCreateParams.WndParent才表示它的Parent
Form2.ShowModal;
form2.ShowModal;
end;
我需要的是这三个窗体(一个主窗体、两个子窗体),同时可以操作。
//窗口悬浮最顶层
with Form1 do
SetWindowPos(Handle,
HWND_TOPMOST,Left,Top,Width,Height,
SWP_NOACTIVATE or SWP_NOMOVE or SWP_NOSIZE);
在上面的窗口中
procedure CreateParams(var Params: TCreateParams); override;procedure TfrmFront.CreateParams(var Params: TCreateParams);
begin
inherited;
Params.WndParent := frmBottom.Handle;
end;
HWND_TOPMOST,Left,Top,Width,Height,
SWP_NOACTIVATE or SWP_NOMOVE or SWP_NOSIZE);
正解
这样可以吗?你的这个函数写在哪个窗体上阿?主窗体?还是第二个窗体,还是……
要是主窗体设置成桌面,上面的控件都不显示了。我要达到的效果是:
两个子窗体b、c的都相对于主窗体a总在最前,
但是我现在希望其中的一个子窗体c,相对于另一个子窗体b也总在最前,不管焦点在哪个窗体上。但是对于其他的程序不是总在最前的。
(不考虑MDI方式,不能把一个窗体的Parent设置为另一个窗体,因为这样不符合需求)
写法参考我前面写的代码。
不能把一个窗体的Parent设置为另一个窗体,因为这样不符合需求。
什么不能把一个窗体的Parent设置为另一个窗体,简直就是废话
程序能Run就是了,没人去看你的Code的按你的所谓要求是没解的。
呵呵,一个窗体的Parent设置为另一个窗体的话,那这个窗体活动区域就局限于父窗体了,这个在设计上不符合需求,这很好笑吗?看来真的是没有解了。
覆盖Form的
protected
procedure CreateParams(var Params: TCreateParams); override;procedure TForm2.CreateParams(var Params: TCreateParams);
begin
inherited;
with Params do
begin
Style := Params.Style xor WS_DLGFRAME;
WndParent := 0;
end;
end;------------
然后再Form的Create下面写
SetWindowLong(Handle, GWL_EXSTYLE, WS_EX_TOOLWINDOW);
procedure TForm1.CreateParams(var Params: TCreateParams);
begin
inherited;
Params.WndParent := MainForm.Handle;
end;
//Form2
procedure TForm2.CreateParams(var Params: TCreateParams);
begin
inherited;
Params.WndParent := Form1.Handle;
end;这样就是 Form1 Form2都在MainForm前
而Form2在Form1前
一般的工具窗口或者其它的ModalessDialog都是这样做的,我不太明白为什么不能符合你的要求
你把我这段代码运行一下 就可以看到到底是怎样了
而这个参数对于层叠窗口而言只是表示它的Owner Window
An owned window is an overlapped window that is destroyed when its owner window is destroyed or hidden when its owner is minimized; it is always displayed on top of its owner window. 只有WS_CHILD窗口的TCreateParams.WndParent才表示它的Parent
果然可以,谢谢指点!