首页  编辑  

窗体的动画显示

Tags: /超级猛料/VCL/Form,窗体/窗体特效/   Date Created:

类似网络蚂蚁的弹出通知窗口:

procedure TForm1.FormShow(Sender: TObject);

begin

 AnimateWindow (Handle, 400, AW_CENTER);

///  AnimateWindow (Handle, 400, AW_BLEND);  ///淡入

end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);

begin

 AnimateWindow (Handle, 400, AW_CENTER or AW_HIDE);

///  AnimateWindow (Handle, 400, AW_BLEND or $00010000); ///淡出

end;

在form上胡乱放些控件,然后

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);

begin

 AutoScroll := False;

 repeat

   ScaleBy (93, 100);

   Application.ProcessMessages;

 until Height < 70;

end;

不知大家还有没有别的有意思的东西,拿出来同乐吧!

(注:上面的程序是从国外的一篇文章上找的)

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);

begin

AnimateWindow(handle,300,AW_HIDE or AW_CENTER);

AnimateWindow(handle,300,AW_HIDE or AW_BLEND);(windwos2000 用效果好)

end;

效果也还可以

to 烂泥:高!我再增加一点趣味性:

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);

begin

 // 正常的工作在此进行

 if CanClose then

 begin

   Randomize;

   AnimateWindow(handle,200,AW_HIDE or Random(16)+1);

 end;

end;

**********************************************************

我在程序的窗體加入一image做為背景,但為何配合aimatewindow使用,執行後卻看不到背景圖案,請問是何原因???

procedure TForm1.FormShow(Sender: TObject);

begin

AnimateWindow (Handle, 800, AW_center);

end;

回复人: blazingfire(烈焰) (  ) 信誉:100  2002-9-9 20:47:34  得分:0  

 伴水老大的方法也不行的。//以下是摘自<<Delphi未经证实之葵花宝典>>

原因很简单,但是解决方法很麻烦。

   MSDN文档说窗体中的控件的windows程序必须处理WM_PRINT或WM_PRINTCLIENT消息,使它们与AnimateWindow API函数一起使用。这些消息当Windows需要在屏幕以外的显示环境(如打印机,在这里使屏幕外位图)绘图时被使用。该文档说普通控件和对话框的窗口程序已经处理了这些消息。

   这就解释了一些控件绘图正常:例如TButton, TCheckBox和TRadioButton它们拥有和管理底下的按钮控件,这样它们能正确的处理消息。

   绘图有错误的控件是一种中间类型,它们拥有按钮控件但是一些部分使应用Dephi的TCanvas而不是Windows GDI绘制的,如TEdit, TRichEdit和其他这样的控件。

   不可见的控件是完全不拥有普通控件的那些,它们都是TGraphic的后代,如TShape和TBevel。这些控件决不会画出来,因为它们接收不到需要的消息。

   但是,对从TWinControl衍生出来的Delphi对象,你可以这样从中间截取和处理WM_PRINTCLIENT消息:

unit TestGroupBox;

interface

uses

 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

 StdCtrls;

type

 TTestGroupBox = class(TGroupBox)

 private

   { Private declarations }

 protected

   { Protected declarations }

   procedure WMPrintClient(var Msg: TMessage); message WM_PRINTCLIENT;

 public

   { Public declarations }

 published

   { Published declarations }

 end;

procedure Register;

implementation

procedure Register;

begin

 RegisterComponents(''Test'', [TTestGroupBox]);

end;

{ TTestGroupBox }

procedure TTestGroupBox.WMPrintClient(var Msg: TMessage);

begin

    PaintTo(HDC(Msg.WParam), 0, 0);

end;

end.

   这是一个从TGroupBox派生出来的例子组件。由于TGroupBox拥有的不是一个普通窗口控件,WM_PRINTCLIENT没有被处理。程序添加消息处理函数并在一个不同的显示环境中使用PaintTo方法,这些都是直接了当的。

   现在是麻烦的部分了:你窗体的每一个控件都必须这样修改,而且你必须修改你所有的对象才能安全使用AnimateWindow API函数。

回复人: zswang(伴水)(流浪在北京) (  ) 信誉:127  2002-9-9 20:51:57  得分:0  

 to blazingfire:

不知道你的测试结果是什么,能用的是什么控件来调试呢?

如下是一狠招。

procedure TForm1.FormShow(Sender: TObject);

var

 I: Integer;

begin

 AnimateWindow(Handle, 800, AW_ACTIVATE or AW_CENTER); //别忘AW_ACTIVATE,我说调试怎么这样别扭

 for I := 0 to ComponentCount - 1 do

   if Components[I] is TControl then

     TControl(Components[I]).Repaint;

end;

回复人: pazee(耙子) (  ) 信誉:92  2002-09-09 21:02:00  得分:0  

 伴水的招数的确狠,东西时都出来,可是都是在动画晚了之后蹦出来的。

AnminateWindow 这个是win2k出来才正式宣布出来的。可能borland当时没考虑到。新版的delphi 7估计重新写了这些控件的消息处理。

 

回复人: Kingron(单身走我路……) (  ) 信誉:112  2002-09-09 21:41:00  得分:0  

 zswang,赫赫,不要用Repaint,这样强制Refresh消耗时间,用Invalidate会根据需要Repaint,而且,你没有考虑容器控件的情况!

我是这样做的:

procedure TFrmBase.FormShow(Sender: TObject);

 procedure RefreshControl(Control: TControl);              ///可能包含子控件,也要刷新

 var

   i               : integer;

 begin

   Control.Invalidate;

   if Control is TWinControl then

     for i := 0 to TWinControl(Control).ControlCount - 1 do

       RefreshControl(TWinControl(Control).Controls[i]);

 end;

begin

 AnimateWindow(Handle, 200, AW_SLIDE + AW_CENTER);///动画显示

 RefreshControl(Self); ///使用动画之后,必须Refresh,否则控件看不到!

 SetActiveWindow(Handle); ///激活窗口

end;