Delphi模拟最小化恢复关闭按纽

2016-01-29 14:28 49 1 收藏

Delphi模拟最小化恢复关闭按纽,Delphi模拟最小化恢复关闭按纽

【 tulaoshi.com - Delphi 】

  我们做多文档应用程序开发时,如果在主From中指定mainMenu时,在主菜单上右角上会自动出现最小化,恢复,关闭按纽,但主菜单放入Toolbar等中时,该三个按纽不会自动出现,因此需要编程实现。

  实现原理:

  按纽的实现,从Tbitbtn继承下来最理想,但需要过滤TbitBtn的焦点响应消息,使其不能获得焦点状态。

  按纽的功能的实现是比较关键的,Delphi中提供了标准action对象(Twindowclose)来实现关闭当前激活的子窗体的功能。

  当没有提供最小化及恢复功能的Action,因此有必须编程实现该两个对象分别命名为TWindowMinimize和TWindowRestore;并且编程是十分简单的。

  为什么要采用action来实现最小化,恢复和关闭MDI子窗体具体的功能呢,这是因为,Delphi已经实现了其状态的自动变更。

  另外,这三按纽必须保持在主界面的位置一直处于右上角.因此,需要在主窗体改变大小的时候,重新计算其位置。

  由于只有子窗体最大化时,这三个按纽才能出现,因此,需要在idel事件中去判断当前的子窗体的状态,以便决定这三个按纽是否隐藏或可见.

  具体代码如下:

unit ufrmMain;

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/delphi/)

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ActnList, AppEvnts, ImgList, StdCtrls, Buttons, StdActns, Menus,
ToolWin, ComCtrls;

type

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/delphi/)

//最大最小化按纽类
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);

来源:http://www.tulaoshi.com/n/20160129/1493410.html

延伸阅读
标签: Web开发
   这个弹窗代码,效果很好,不过有点复杂!请细看!    这里涉及三个页面:    弹窗页:1.htm  放置弹窗代码的页面    中间页:2.htm  中间过度页面    弹出页:3.htm  被弹出的页面    在1.htm放入代码如下:主要是通过对话框强制弹出2.htm,大小为0,0 &nbs...
标签: 浏览器
解决IE窗口始终最小化的问题   有些用户由于一些误操作,导致每次打开的新窗口都是最小化窗口,即便单击最大化按钮后,下次启动IE后新窗口仍旧是最小化的。 这是什么原因呢?这是由于IE具有自动记忆功能,它能保存上一次关闭窗口后的状态参数,IE本身没有提供相关设置选项,不过可以借助修改注册表来实现,下面小编教你一种解决方...
MSN怎么最小化到右下角?   其实这个主要是微软自家的Windows Live Messenger也就是MSN没有完好的兼容windows7,所以默认Windows Live  Messenger 的图标不会最小化到托盘区,其实只需要一个小小的修改就可以实现这个功能了 具体操作如下: 如果 Windows Live Messenger 正开着, 先将其关掉; 然后鼠标点击你之前...
一些应用软件提供了一种方便的功能,只需要一个操作就可以将Windows桌面上的所有窗口最小化。首先,我们要遍历桌面上的所有窗口;其次,要判断窗口类型,桌面上的很多窗口无法最小化,或者窗口是不可见的,如中文Win 95中的输入法窗口。最后,将类型符合的窗口最小化。下面通过程序来介绍如何实现这种功能。 首先,在Project中加入一...
(*)Form淡出 1)AnimateWindow(Form1.Handle,1000,AW_BLEND);//淡入   AnimateWindow(Form1.Handle,1000,AW_HIDE or AW_BLEND);//淡出 2)窗体有AlphaBlend属性和AlphaBlendValue属性,将AlphaBlend属性设为True,然后在Timer组件中随着时间改变AlphaBlendValue的值(0-255)即可   AlphaBlendValue:=1;//窗体透明...