::一个窗口的问题,一点不难,能用立刻结帐:: ( 积分: 200 )

  • 主题发起人 主题发起人 vvyang
  • 开始时间 开始时间
V

vvyang

Unregistered / Unconfirmed
GUEST, unregistred user!
1、我的程序除了主窗口 Form0 外还有 2 个窗口,都是动态创建,其中 Form1 用 Show 显示,并且用下面的方法隐藏了 Application 的任务栏并使 Form1 在任务栏显示:
program Project1;
uses
Windows,
Forms,
Form0 in 'Form0.pas';
begin
Application.Initialize;
SetWindowLong(Application.Handle, GWL_EXSTYLE, WS_EX_TOOLWINDOW);
Application.CreateForm(TForm0, Form0);
Application.Run;
end.

procedure TForm1.CreateParams(var Params: TCreateParams);
begin
inherited;
with Params do
begin
ExStyle := ExStyle or WS_EX_APPWINDOW;
WndParent := 0;
end;
end;
2、另外一个 Form2 是用 ShowModal 显示的(它是一个设置属性的窗口),不在任务栏显示;
3、按理说 Form2 应该一直待在 Form1 的上面,结果我一点击 Form1 的任务栏图标 Form1 就跑到 Form2 的上面来啦!哪位老兄能让 Form1 老老实实呆在 Form2 的下面,区区 200 分不成敬意。
4、紫光拼音 4.0 真他妈是垃圾,一键入“分”、“和”就他妈出现异常,×他老目。
 
1、我的程序除了主窗口 Form0 外还有 2 个窗口,都是动态创建,其中 Form1 用 Show 显示,并且用下面的方法隐藏了 Application 的任务栏并使 Form1 在任务栏显示:
program Project1;
uses
Windows,
Forms,
Form0 in 'Form0.pas';
begin
Application.Initialize;
SetWindowLong(Application.Handle, GWL_EXSTYLE, WS_EX_TOOLWINDOW);
Application.CreateForm(TForm0, Form0);
Application.Run;
end.

procedure TForm1.CreateParams(var Params: TCreateParams);
begin
inherited;
with Params do
begin
ExStyle := ExStyle or WS_EX_APPWINDOW;
WndParent := 0;
end;
end;
2、另外一个 Form2 是用 ShowModal 显示的(它是一个设置属性的窗口),不在任务栏显示;
3、按理说 Form2 应该一直待在 Form1 的上面,结果我一点击 Form1 的任务栏图标 Form1 就跑到 Form2 的上面来啦!哪位老兄能让 Form1 老老实实呆在 Form2 的下面,区区 200 分不成敬意。
4、紫光拼音 4.0 真他妈是垃圾,一键入“分”、“和”就他妈出现异常,×他老目。
 
不会吧..不知你的有什么问题。。我试了一下..不知是不是按你的意思了。。
dpr 文件
program Project1;

uses
Windows,
Forms,
Unit1 in 'Unit1.pas' {Form1},
Unit2 in 'Unit2.pas' {Form2};

{$R *.res}

begin
Application.Initialize;
SetWindowLong(Application.Handle, GWL_EXSTYLE, WS_EX_TOOLWINDOW);
Application.CreateForm(TForm1, Form1);
Application.Run;
end.


/////////////////////////////////
procedure TForm1.Button1Click(Sender: TObject);
begin
Form2 := TForm2.Create(Application);
Try
Form2.ShowModal;

Finally
Form2.Free;
Form2 := Nil;
end;
end;
 
你的主Form、Form1、Form2分别是模态还是非模态的?
 
To xianguo:
Form0 是主窗口,Form1 是非模式窗口,Form2 是模式窗口。
To gooodlife:
我不是想让你调试程序,我的程序暂时没有问题,问题在第 3 条写的很清楚,麻烦再看一看哈。
 
Form设为 fsStayOnTop 类型呢
 
紫光拼音终于出 4.0了,听你这么说我都不敢用了
 
To xianguo:
1、我试过 fsStayOnTop 不行的。
2、紫光那个问题我解决了,把设置中“特殊字词和短语”那里面的内容都清空就行了,画蛇添足,×他老目。你用的时候也注意改一下。
 
说真的。。有点看不明白。。。不好意思了
 
用SetWindowPos(Form2.Handle ,HWND_TOPMOST, Form2.Left,
Form2.Top, Form2.Width, Form2.Height, 0);呢?
 
public
procedure CreateParams(var Params: TCreateParams); override;

procedure TForm2.CreateParams(var Params: TCreateParams);
begin
inherited CreateParams(Params);
with Params do
begin
EXStyle := ExStyle or WS_EX_TOPMOST;
WndParent := GetDesktopWindow;
end;
end;
在form2上加上, perfect!
 
其实有个简单的巧办法,就是在进入FORM2之前将FORM1.ENABLE:=FALSE;在退出FORM2时再还原。
 
procedure Tform2.FormCreate(Sender: TObject);
begin
SetWindowPos(Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE);
{始窗口位在最前面}
end;
這樣就行了...
 
To 各位哥们:
1、谢谢你们的回答,我其实是想让 Form2 模态窗口总是位于本程序所有窗口的最上面,而不是 Windows 所有窗口的最上面,你们说的“总在最前”的方法俺早就会了。
2、怪我问题没问清楚,为此我自罚 200,明天把分给哥几个分了。问题已经基本解决,我用截获消息的方法能够实现预定功能,只不过会小闪那么一下。
3、其实 Word 这种典型的任务栏多窗口也没有实现这个功能。你们可以试一下,打开多个 Word 窗口,在任意一个窗口工具栏上点击 [工具]|[选项],这时点击别的 Word 窗口,他奶奶的,Word 变得跟傻 × 一样。
 
学习中。。。。。。。。。。
 
哦,原来是这样的,不过也给楼主的一时大意吧。
 
多人接受答案了。
 
后退
顶部