如何最小化窗体(100分)

  • 主题发起人 主题发起人 delphi2046
  • 开始时间 开始时间
D

delphi2046

Unregistered / Unconfirmed
GUEST, unregistred user!
我用如下代码把窗体显示出来,但是当点最小化按钮时不起作用!!
Exstyle := WS_EX_TOOLWINDOW or WS_EX_NOPARENTNOTIFY;
WndParent := HWND_DESKTOP;
WinClassName := '窗体名称';
急切等待。。。。。。
 
转delphi葵花宝典:
很不幸,Borland漏掉了Windows95用来最小化和恢复窗口的缩放效果。利用下面工程中的代码,你可以在程序中实现窗口缩放。

基础:Delphi是怎样用窗体的

可能你已经注意到你的程序在任务栏上的标题与程序主窗体的标题不一样(例如当你在application选项中设置的程序名与你的主窗体名字不同)。这是因为Delphi把程序(application)当成真正的主窗体(它被隐藏了),但它是存在的(你可以用某些技巧使它可见)。程序的窗体没有在任务栏显示出来。现在关于缩放窗口的第二点是Borland写了它自己的代码来最小化窗体,而不是利用Windows提供的程序。从一方面看这是合乎逻辑的:如果窗体不在任务栏显示,为什么它要缩放到其中?但是,这些是用户所不知道的,他们不明白为什么你的窗口不会缩放。


将你的窗体变为APPWINDOW

为了使你的窗体能缩放,第一步是使他们在任务栏中显示。Windows95提供了决定窗口是否在任务栏显示的扩展窗口样式属性,你所要做的是设置这个属性。我写过利用Delphi不支持的窗口样式属性的工程(对不起,它是用德语写的,没有英语版本)。

在窗体声明中加入一行代码:

procedure CreateParams(var Params: TCreateParams); override;

在实现部分加入一个过程:

procedure TForm1.CreateParams(var Params: TCreateParams);
begin
inherited CreateParams(Params);
Params.ExStyle:= Params.ExStyle or WS_EX_APPWINDOW;
end;

运行程序,你将看到现在Form1在任务栏中。

将程序从任务栏中去掉

当然你不想为一个窗体在任务栏中显示两个按钮,因此你必须隐藏程序窗口(窗口本身对用户已是不可见的了)。你可以在窗体的OnCreate方法中达到这个目的:

procedure TForm1.FormCreate(Sender: TObject); begin
ShowWindow(Application.Handle, SW_HIDE);
end;

现在使窗口缩放。

现在你必须实现缩放效果了。你必须处理WM_SYSCOMMAND消息,它当需要最小化和恢复时被发送到窗体。在消息处理中,你必须利用标准的用来最小化窗体的Windows API函数调用,而不是Delphi所提供的。首先,在你的窗体的私有声明处加入下面一行:

procedure WMSysCommand(var Msg: TWMSysCommand); message WM_SYSCOMMAND;

然后,写下面的消息处理函数:

procedure TForm1.WMSysCommand(var Msg: TWMSysCommand);
begin
case Msg.CmdType of
SC_MINIMIZE: begin
ShowWindow(Handle, SW_MINIMIZE);
(**) Application.Minimize;
(**) ShowWindow(Application.Handle, SW_HIDE);
(**) ShowWindow(Handle, SW_MINIMIZE);
end;
SC_RESTORE: begin
(**) Application.Restore;
ShowWindow(Handle, SW_RESTORE);
(**) ShowWindow(Application.Handle, SW_HIDE);
end;
else
inherited;
end;
end;

这个方法做了什么?首先,它通过调用windows API的ShowWindow过程来最小化自己。它然后在调用Application.Minimize使其他窗体最小化。但是现在程序按钮又回到了任务栏,因为它不再被隐藏而被最小化了。这样再用同样的方法使它隐藏。现在所有的都从任务栏上消失了,剩下的SC_MINIMIZE一行使我们在任务栏上看到窗体的按钮。

当窗体恢复时,它先调用Application.Restore使所有其他窗体显示。但它没有恢复主窗体,因为它在Application.Minimize调用时已被最小化了。然后窗体恢复自身。现在程序的按钮又出现在任务栏上,因为它被恢复了。这样你再使它隐藏。

当程序只使用一个窗体时,所有标有(**)的行可以被省略(我不能肯定,但我认为当其他窗体都是主窗体的子窗体时(例如在MDI程序中),你可以省略它们)。当然,这也可以适用于窗体只在模块中显示的情况,因为当模态窗体活动时程序是不能被最小化的。


投稿人:CoDelphi.com 投稿日期:2001-5-12 15:37:00
 
ShowWindow(Handle, SW_MINIMIZE);
 
多人接受答案了。
谢谢各位高人了!!
 
后退
顶部