怎么使程序中的多个非模式窗口同时置顶呢
如何使程序中的多个非模式窗口同时置顶呢
做了一个程序,主窗口form1,还有两个窗口form2, form3
程序运行时需要将这三个窗口都作为浮动窗口显示在桌面上,操作其他软件也不会将这三个窗口遮盖。请问要如何来做呢?
现在在每个窗口的create事件中均调用
SetWindowPos(Handle, HWND_TOPMOST, 0, 0, 0, 0,
SWP_NOMOVE or SWP_NOSIZE);
将其置顶;程序刚运行时还可以,但是如果点击了form2或者form3窗口,这两个窗口就没有置顶的属性了,在点击其他软件,这两个窗口就跑到后面去了,看不见了。
请问大家,我还要注意什么,如何做呢
大家可以做个简单的demo试试
------解决方案--------------------
将他们放在一个大窗口里怎么样?
procedure TForm1.Button2Click(Sender: TObject);
begin
FormStyle := fsStayOnTop;
with (TForm.Create(Self)) do
begin
Parent := Self;
Show;
end;
with (TForm.Create(Self)) do
begin
Parent := Self;
Show;
end;
end;
------解决方案--------------------
如上,只要把窗体的FormStyle改为fsStayOnTop就可以了
还有另外一个办法就是可以用ShowModal,这个需要修改修改窗体的内在信息,使之在模式状态下不堵塞,比较麻烦!
------解决方案--------------------
举一个简单例子,有两个窗体,form1,form2,form1是主窗体,form2动态生成,两个窗体同时出现,并处在最上...
D7,WINXP,测试通过..
工程文件:
program Project1;
uses
Forms,
Unit1 in 'Unit1.pas ' {Form1},
Unit2 in 'Unit2.pas ' {Form2};
{$R *.res}
begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
form1的
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
procedure CreateParams(var Params: TCreateParams);override;
end;
var
Form1: TForm1;
implementation
uses Unit2;
{$R *.dfm}
procedure TForm1.CreateParams(var Params: TCreateParams);
begin
inherited CreateParams(Params);
with Params do
begin
ExStyle := ExStyle Or WS_EX_TOPMOST or WS_EX_TOOLWINDOW ;
WndParent := GetDesktopWindow;
// WinClassName := MSGCENTER;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Form1.Left := 0;
form1.Top := 10;
form2 := TForm2.Create(nil);
Form2.Width := Screen.Width-Form1.Width;
Form2.Left := Form1.Width;
Form2.Top :=10;
Form2.Show;
end;
end.
form2的
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
TForm2 = class(TForm)
private
{ Private declarations }
public
procedure CreateParams(var Params: TCreateParams);override;
end;
var
Form2: TForm2;
implementation
{$R *.dfm}
{ TForm2 }
procedure TForm2.CreateParams(var Params: TCreateParams);
begin
inherited CreateParams(Params);
with Params do
begin
ExStyle := ExStyle Or WS_EX_TOPMOST or WS_EX_TOOLWINDOW ;
WndParent := GetDesktopWindow;//关键是这里
// WinClassName := MSGCENTER;
end;
end;
end.
做了一个程序,主窗口form1,还有两个窗口form2, form3
程序运行时需要将这三个窗口都作为浮动窗口显示在桌面上,操作其他软件也不会将这三个窗口遮盖。请问要如何来做呢?
现在在每个窗口的create事件中均调用
SetWindowPos(Handle, HWND_TOPMOST, 0, 0, 0, 0,
SWP_NOMOVE or SWP_NOSIZE);
将其置顶;程序刚运行时还可以,但是如果点击了form2或者form3窗口,这两个窗口就没有置顶的属性了,在点击其他软件,这两个窗口就跑到后面去了,看不见了。
请问大家,我还要注意什么,如何做呢
大家可以做个简单的demo试试
------解决方案--------------------
将他们放在一个大窗口里怎么样?
procedure TForm1.Button2Click(Sender: TObject);
begin
FormStyle := fsStayOnTop;
with (TForm.Create(Self)) do
begin
Parent := Self;
Show;
end;
with (TForm.Create(Self)) do
begin
Parent := Self;
Show;
end;
end;
------解决方案--------------------
如上,只要把窗体的FormStyle改为fsStayOnTop就可以了
还有另外一个办法就是可以用ShowModal,这个需要修改修改窗体的内在信息,使之在模式状态下不堵塞,比较麻烦!
------解决方案--------------------
举一个简单例子,有两个窗体,form1,form2,form1是主窗体,form2动态生成,两个窗体同时出现,并处在最上...
D7,WINXP,测试通过..
工程文件:
program Project1;
uses
Forms,
Unit1 in 'Unit1.pas ' {Form1},
Unit2 in 'Unit2.pas ' {Form2};
{$R *.res}
begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
form1的
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
procedure CreateParams(var Params: TCreateParams);override;
end;
var
Form1: TForm1;
implementation
uses Unit2;
{$R *.dfm}
procedure TForm1.CreateParams(var Params: TCreateParams);
begin
inherited CreateParams(Params);
with Params do
begin
ExStyle := ExStyle Or WS_EX_TOPMOST or WS_EX_TOOLWINDOW ;
WndParent := GetDesktopWindow;
// WinClassName := MSGCENTER;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Form1.Left := 0;
form1.Top := 10;
form2 := TForm2.Create(nil);
Form2.Width := Screen.Width-Form1.Width;
Form2.Left := Form1.Width;
Form2.Top :=10;
Form2.Show;
end;
end.
form2的
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
TForm2 = class(TForm)
private
{ Private declarations }
public
procedure CreateParams(var Params: TCreateParams);override;
end;
var
Form2: TForm2;
implementation
{$R *.dfm}
{ TForm2 }
procedure TForm2.CreateParams(var Params: TCreateParams);
begin
inherited CreateParams(Params);
with Params do
begin
ExStyle := ExStyle Or WS_EX_TOPMOST or WS_EX_TOOLWINDOW ;
WndParent := GetDesktopWindow;//关键是这里
// WinClassName := MSGCENTER;
end;
end;
end.