delphi7里面怎么实现禁止最小化d
我们做多文档应用程序开发时,如果在主From中指定mainMenu时,在主菜单上右角上会自动出现最小化,恢复,关闭按纽,但主菜单放入Toolbar等中时,该三个按纽不会自动出现,因此需要编程实现。
实现原理:
按纽的实现,从Tbitbtn继承下来最理想,但需要过滤TbitBtn的焦点响应消息,使其不能获得焦点状态。
按纽的功能的实现是比较关键的,Delphi中提供了标准action对象(Twindowclose)来实现关闭当前激活的子窗体的功能。
当没有提供最小化及恢复功能的Action,因此有必须编程实现该两个对象分别命名为TWindowMinimize和TWind...全部
我们做多文档应用程序开发时,如果在主From中指定mainMenu时,在主菜单上右角上会自动出现最小化,恢复,关闭按纽,但主菜单放入Toolbar等中时,该三个按纽不会自动出现,因此需要编程实现。
实现原理:
按纽的实现,从Tbitbtn继承下来最理想,但需要过滤TbitBtn的焦点响应消息,使其不能获得焦点状态。
按纽的功能的实现是比较关键的,Delphi中提供了标准action对象(Twindowclose)来实现关闭当前激活的子窗体的功能。
当没有提供最小化及恢复功能的Action,因此有必须编程实现该两个对象分别命名为TWindowMinimize和TWindowRestore;并且编程是十分简单的。
为什么要采用action来实现最小化,恢复和关闭MDI子窗体具体的功能呢,这是因为,Delphi已经实现了其状态的自动变更。
另外,这三按纽必须保持在主界面的位置一直处于右上角。因此,需要在主窗体改变大小的时候,重新计算其位置。
由于只有子窗体最大化时,这三个按纽才能出现,因此,需要在idel事件中去判断当前的子窗体的状态,以便决定这三个按纽是否隐藏或可见。
具体代码如下:
unit ufrmMain;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ActnList, AppEvnts, ImgList, StdCtrls, Buttons, StdActns, Menus,
ToolWin, ComCtrls;
type
//最大最小化按纽类
TMDIButton = class(TBitbtn)
private
public
//由于由Tbitn继承而来,因此需要屏蔽其获得焦点的消息
procedure wndproc(var message: Tmessage); override;
end;
TWindowMinimize = class(TWindowAction)
public
//按纽功能,将当前最前的子window状态改为wsMinimize;
procedure ExecuteTarget(Target: TObject); override;
end;
TWindowRestore = class(TWindowAction)
public
//按纽功能,将当前最前的子window状态改为wsNormal;
procedure ExecuteTarget(Target: TObject); override;
end;
TFrmMain = class(TForm)
//保存windows的最小化,恢复,关闭的图标
MDIImageList: TImageList;
//当程序不忙时,判断最大,最小化按纽的是否应该隐藏还是可见
ApplicationEvents1: TApplicationEvents;
//
ActMdiForm: TActionList;
ToolBar1: TToolBar;
MainMenu1: TMainMenu;
N1: TMenuItem;
open1: TMenuItem;
help1: TMenuItem;
procedure FormCreate(Sender: TObject);
procedure ApplicationEvents1Idle(Sender: TObject; var Done: Boolean);
procedure FormResize(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure open1Click(Sender: TObject);
private
//模拟mdiform窗体最小化,关闭及恢复按纽对象
BtnMin, BtnRestore, BtnClose: TMDIButton;
Windowclose: TWindowClose;
WindowMinimize: TWindowMinimize;
WindowRestore: TWindowRestore;
procedure SetMDIFormActionPos;
public
{ Public declarations }
end;
var
FrmMain: TFrmMain;
implementation
{$R *。
dfm}
procedure TFrmMain。FormCreate(Sender: TObject);
begin
//建立关闭Button
BtnClose := TMDIButton。
Create(self);
BtnClose。Visible := false;
BtnClose。Parent := self;
BtnClose。Width := 16;
Btnclose。
Height := 15;
//建立关闭功能Action
WindowClose := TWindowClose。Create(nil);
//指定其图标
WindowClose。ActionList := ActMdiForm;
WindowClose。
ImageIndex := 2; //关闭;
WindowClose。Caption := '';
//将action与button关联
BtnClose。Action := WindowClose;
BtnClose。
BringToFront;
BtnClose。Visible := false;
//建立最小化Button
BtnMin := TMDIButton。Create(self);
BtnMin。
Visible := false;
BtnMin。Parent := self;
BtnMin。width := 16;
BtnMin。height := 15;
//建立最小化功能action
WindowMinimize := TWindowMinimize。
Create(nil);
//指定其图标
WindowMinimize。ActionList := ActMdiForm;
WindowMinimize。Caption := '';
WindowMinimize。
ImageIndex := 0;
//将action与button关联
BtnMin。Action := WindowMinimize; //最小化
BtnMin。BringToFront;
BtnMin。
Visible := false;
//建立恢复功能Button
BtnRestore := TMDIButton。Create(self);
BtnRestore。Visible := false;
BtnRestore。
Parent := self;
BtnRestore。Width := 16;
BtnRestore。height := 15;
//建立恢复功能action
WindowRestore := TWindowRestore。
Create(nil);
//指定其图标
WindowRestore。ActionList := ActMdiForm;
WindowRestore。Caption := '';
WindowRestore。
ImageIndex := 1;
//将action与button关联
BtnRestore。Action := WindowRestore;
BtnRestore。BringToFront;
BtnRestore。
Visible := false;
//设置按纽位置,位置保持在主界面上相对不变
SetMDIFormActionPos;
end;
procedure TFrmMain。ApplicationEvents1Idle(Sender: TObject;
var Done: Boolean);
var
show: boolean;
begin
//当前子窗体的状态为最大化时,显示三个按纽
show := (self。
ActiveMDIChild <> nil) and (self。ActiveMDIChild。WindowState =
wsMaximized);
if assigned(BtnClose) and BtnClose。
Visible <> Show then
BtnClose。Visible := Show;
if assigned(BtnMin) and BtnMin。Visible <> Show then
BtnMin。
Visible := Show;
if assigned(BtnRestore) and BtnRestore。Visible <> Show then
BtnRestore。Visible := Show;
end;
//设置按纽的相对位置不变
procedure TfrmMain。
SetMDIFormActionPos;
begin
if assigned(BtnClose) then
begin
BtnClose。left := Width - 26;
p := 6;
end;
if assigned(BtnRestore) then
begin
BtnRestore。
Left := Width - 44;
BtnRestore。Top := 6;
end;
if assigned(BtnMin) then
begin
BtnMin。Left := Width - 60;
BtnMin。
Top := 6;
end;
end;
procedure TFrmMain。FormResize(Sender: TObject);
begin
SetMDIFormActionPos;
end;
procedure TFrmMain。
FormDestroy(Sender: TObject);
begin
//释放资源
if assigned(BtnClose) then
begin
WindowClose。ActionList := nil;
ee;
BtnClose。
Free;
BtnClose := nil;
end;
if assigned(BtnRestore) then
begin
WindowRestore。ActionList := nil;
ee;
BtnRestore。
Free;
BtnRestore := nil;
end;
if assigned(BtnMin) then
begin
WindowMinimize。ActionList := nil;
ee;
BtnMin。
Free;
BtnMin := nil;
end;
end;
{ TWindowRestore }
procedure TWindowRestore。ExecuteTarget(Target: TObject);
begin
inherited;
with GetForm(Target) do
ActiveMDIChild。
WindowState := wsnormal;
end;
{ TMDIButton }
procedure TMDIButton。wndproc(var message: Tmessage);
begin
if g = wm_SetFocus then exit;
inherited wndproc(message);
end;
{ TWindowMinimize }
procedure TWindowMinimize。
ExecuteTarget(Target: TObject);
begin
inherited;
with GetForm(Target) do
ActiveMDIChild。WindowState := wsMinimized;
end;
procedure TFrmMain。
open1Click(Sender: TObject);
begin
with eate(self) do
begin
formstyle := fsMDIChild;
end;
end;
end。
。收起