窗体的动画显示

字体大小: 中小 标准 ->行高大小: 标准
类似网络蚂蚁的弹出通知窗口:

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;

此文章由 http://www.ositren.com 收集整理 ,地址为: http://www.ositren.com/htmls/68091.html