Delphi 程序窗口动画及正常排列平铺的实现

原创 2004年09月16日 10:25:00

注:此文已有更好的方法,稍后发布
2004年9月16日

 

  Delphi的确是功能非常强的RAD工具,所以我下面要说的不算是“缺陷”的一个小问题丝毫不会影响它在程序员心目中的地位,相反,大家会发现,它的确是不愧为一个功能非常强的RAD工具。
  先来看两幅图,比较一下它们的不同之处。

  左边是HtmlViewer的任务栏菜单,它和在窗口标题栏上点右键弹出的菜单一模一样。
  右边一幅是一个标准的Delphi程序。可以看到,在任务栏上弹出的菜单是TApplication对象的菜单,缺省地,它只有三项:还原、最小化和关闭。


  当然,菜单一不一样并非关键所在,区别在于两点:
  1、在Delphi 3.0和Delphi 4.0中,象右图这样的程序在最小化和还原的时候,窗口是瞬间消失的,并没有象用VC或VB等开发工具编制的程序那样有动态的渐变效果(不过,在Inprise意识到这个问题之后,Delphi 5.0中已经解决)。

  2、我用过的Delphi的三个版本编制的程序,都无法和标准的Windows程序正常地排列平铺(这一点才是最重要的),就是因为有了TApplication对象,我猜测,Windows在将Delphi程序和桌面上的其它窗口排列平铺的时候,得到的是应用程序句柄,而不是程序主窗口的句柄,而TApplication对象是一个没有高度和宽度的特殊窗口,所以问题就出来了。

----------------------------------------------------------------------------------------------------------

  其实我最初并没有一门心思地想解决这两个问题,相反,经历是相当偶然的。

  有一次我看《Delphi 3从入门到精通》学习编写通知栏程序,书上的例子先用了一个方法使得应用程序不显示在任务栏上,之后又说明,在应用程序建立的过程中,有一瞬间是会在任务栏上看到它生成的(尤其是机器较慢的时候),这样显得应用程序不够专业。所以Marco Cantu(《Delphi 3从入门到精通》书的作者) 用了一个办法,在所有窗口初始化之前把应用程序声明为一个动态链接库,等到Application.Initialize执行之后,再恢复为正常的应用程序声明。因为动态链接库不是应用程序,所以从根本上消除了应用程序在任务栏上的生成过程。

  我当然照做。不过,我忽然发现,我的程序有一个窗口的系统菜单和它在任务栏上弹出的系统菜单变得一样了,于是灵感一来,瞬间我便意识到,我有可能做出我要的效果。

  后面的工作当然还很多,简单说来就是:在我尝试了各种各样的情况之后,终于找到了一种方法,可以解决上面的第一个问题(有意思的是,我的Delphi程序从此能够正常排列平铺我事先根本没有想到)。

----------------------------------------------------------------------------------------------------------

  ok,说了这么多,该把解决方案拿出来了,步骤如下:
本文例子源代码下载:1.88k1、New Application,保存之,假设Form1保存为“VirMain.Pas”(建议不要保存为Main之类的名字,因
  为它并不是主窗体,实际编程中它可以是没有用的)。

2、New Form,生成Form2(这才是主窗体)。

3、New Unit,在implementation后面加上:
   initialization
    islibrary :=true;

4、Save All,为工程取好名字,Unit1建议取名为“RunFirst.pas”,主窗口Form2保存为“Main.Pas”。

5、打开工程文件,把“RunFirst in 'RunFirst.pas';”一句移到第一行,并在Application.Initialize语句后添  上下面黑色的两句话,如下:
  program Project1;

  uses
   RunFirst in 'RunFirst.pas',      //注意分号改为逗号
   Forms,
   VirMain in 'VirMain.Pas' {Form1},
   Main in 'Main.Pas' {Form2};

  {$R *.RES}

  begin
   Application.Initialize;
   Application.ShowMainForm :=false;
   islibrary :=true;
   Application.CreateForm(TForm1, Form1);
   Form2 :=TForm2.Create(Application) ;
   Form2.Show;
   Form2.Update ;
   Application.Run;
  end.

6、在Form2的OnClose事件中写如下语句:
  procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
  begin
   Application.Terminate
  end;

发表于“阿甘的家
2000年8月14日

微信小程序中图片占满整个屏幕实现方法

将body和html设置为100%,这样我们就可以在他们的子元素中使用height:100%来使的我们的容器元素占满屏幕的高度啦。 但是在微信小程序中,是没有dom对象的,根节点是page,使用...
  • OLiver_web
  • OLiver_web
  • 2017年01月13日 11:34
  • 8591

Delphi给图片添加平铺水印效果

 function TForm1.WaterMaskBitmap(SrcBmp, MaskBmp: Tbitmap;AlphaColor:Tcolor;AlphaValue:integer): Tbi...
  • aroc_lo
  • aroc_lo
  • 2009年11月26日 13:35
  • 1179

C#-Mdi多文档窗口及其子窗口的排列 ---ShinePans

MdiLayout枚举成员及说明 Casecade s所有Mdi层叠在父窗口 TileHorizontal 水平平铺 TitleVertical 垂直平铺 Form...
  • panshang1994
  • panshang1994
  • 2014年04月20日 15:03
  • 3288

Delphi 停靠技术的应用1(在一个窗体中停靠另一个窗体)

一、基础知识介绍 1、VCL组件的基础知识         在TWinControl类中有一个DockSite属性(boolean),它的作用是是否允许别的控件停靠在它的上面;在TCont...
  • my98800
  • my98800
  • 2016年07月26日 14:03
  • 167

delphi 窗体的创建和释放

http://www.cnblogs.com/chenmfly/p/4770490.html delphi 窗体的创建和释放 Delphi中的窗体分为模式窗体和无模式窗体。二者...
  • y13156556538
  • y13156556538
  • 2016年10月21日 10:09
  • 3046

DELPHI中MDI子窗口的关闭 和打开

Delphi中MDI子窗口的关闭方式默认为缩小而不是关闭,所以当你单击子窗口右上角的关闭按钮时会发觉该子窗口只是最小化,而不是你预期的那样被关闭。解决办法是在子窗口的OnClose事件处理过程中加入如...
  • wozengcong
  • wozengcong
  • 2015年01月24日 23:26
  • 3490

Delphi SetParent 嵌入其他应用程序

[代码]Delphi实现窗体内嵌其他应用程序窗体 实现原理是启动一个应用程序,通过ProcessID得到窗体句柄,然后对其设定父窗体句柄为本程序某控件句柄(本例是窗体内一个Panel的句柄)...
  • xtfnpgy
  • xtfnpgy
  • 2014年10月08日 21:45
  • 1578

TStringlist自定义排序

TStringlist顾名思义就是字符串列表,一般用来存储字符串,当然也可以用来存储对象类型,是delphi开发中经常使用的一个类,关于它的详细用法可以参看万一老师的博客,下面主要是记录我在使用中碰到...
  • zhenghui1
  • zhenghui1
  • 2014年06月21日 14:22
  • 4750

Delphi 窗体的创建 和 释放

Delphi窗体创建释放过程及单元文件小结      Delphi中的窗体,有模式窗体与非模式窗体两种。       两种窗体的调用方式不同,模式窗体使用ShowModal显示,非模式窗体使用Sh...
  • lailai186
  • lailai186
  • 2013年06月04日 14:39
  • 2687

delphi 异形窗体可半透明

unit xDrawForm; interface uses Windows, Messages, SysUtils, Classes, Controls, Forms, Menus, Gr...
  • wc1000
  • wc1000
  • 2015年07月18日 16:05
  • 969
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Delphi 程序窗口动画及正常排列平铺的实现
举报原因:
原因补充:

(最多只允许输入30个字)