Delphi模拟最小化恢复关闭按纽
2017-10-26 11:01
134 查看
https://yq.aliyun.com/wenji/96083
本文讲的是Delphi模拟最小化恢复关闭按纽, 我们做多文档应用程序开发时,如果在主From中指定mainMenu时,在主菜单上右角上会自动出现最小化,恢复,关闭按纽,但主菜单放入Toolbar等中时,该三个按纽不会自动出现,因此需要编程实现
我们做多文档应用程序开发时,如果在主From中指定mainMenu时,在主菜单上右角上会自动出现最小化,恢复,关闭按纽,但主菜单放入Toolbar等中时,该三个按纽不会自动出现,因此需要编程实现。
实现原理:
按纽的实现,从Tbitbtn继承下来最理想,但需要过滤TbitBtn的焦点响应消息,使其不能获得焦点状态。
按纽的功能的实现是比较关键的,Delphi中提供了标准action对象(Twindowclose)来实现关闭当前激活的子窗体的功能。
当没有提供最小化及恢复功能的Action,因此有必须编程实现该两个对象分别命名为TWindowMinimize和TWindowRestore;并且编程是十分简单的。
为什么要采用action来实现最小化,恢复和关闭MDI子窗体具体的功能呢,这是因为,Delphi已经实现了其状态的自动变更。
另外,这三按纽必须保持在主界面的位置一直处于右上角.因此,需要在主窗体改变大小的时候,重新计算其位置。
由于只有子窗体最大化时,这三个按纽才能出现,因此,需要在idel事件中去判断当前的子窗体的状态,以便决定这三个按纽是否隐藏或可见.
具体代码如下:
本文讲的是Delphi模拟最小化恢复关闭按纽, 我们做多文档应用程序开发时,如果在主From中指定mainMenu时,在主菜单上右角上会自动出现最小化,恢复,关闭按纽,但主菜单放入Toolbar等中时,该三个按纽不会自动出现,因此需要编程实现
我们做多文档应用程序开发时,如果在主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; BtnClose.top := 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; WindowClose.free; BtnClose.Free; BtnClose := nil; end; if assigned(BtnRestore) then begin WindowRestore.ActionList := nil; WindowRestore.free; BtnRestore.Free; BtnRestore := nil; end; if assigned(BtnMin) then begin WindowMinimize.ActionList := nil; WindowMinimize.free; 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 message.msg = 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 Tform.create(self) do begin formstyle := fsMDIChild; end; end; end.
相关文章推荐
- delphi 子窗体只能最小化不能关闭的解决方案
- delphi:点关闭按钮窗口最小化
- Delphi 拦截/封锁 点击窗体右上角 最小化 最大化 层叠 关闭 按钮
- delphi窗体去掉最大化,最小化,关闭按钮
- 让Windows7任务栏图标显示Windows菜单(恢复,最小化,关闭)
- delphi代码实现窗口最小化,最大化,关闭消息发送
- Delphi 自定义窗体(最大化、最小化、关闭、窗体的移动)
- vc 最大化、最小化、恢复和关闭命令。。。
- 远程登陆最小化或关闭 模拟键盘操作失效
- Jq-模拟最大化最小化关闭
- delphi点击关闭按钮让窗体最小化
- outlook关闭时最小化工具
- delphi 恢复
- Mac窗口的关闭,最小化,最大化按钮事件处理
- Delphi下利用WinIo模拟鼠标键盘详解
- 用Delphi模拟键盘输入
- win7最小化最大化关闭按钮样式设置
- winform 窗体关闭按钮禁用、不显示最大化、最小化、关闭按钮 分类: WinForm 2014-12-22 16:09 82人阅读 评论(0) 收藏
- Qt在MDI area中新建subwindow时,默认最大最小化及关闭按钮在标题栏左边,怎么移到右边去
- js弹出窗口、右下角浮动窗体(最小化最大化关闭)