窗体的动画显示

  • 主题发起人 主题发起人 import
  • 开始时间 开始时间
I

import

Unregistered / Unconfirmed
GUEST, unregistred user!
类似网络蚂蚁的弹出通知窗口:
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 is TControl then
TControl(Components).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);
end;
begin
AnimateWindow(Handle, 200, AW_SLIDE + AW_CENTER);///动画显示
RefreshControl(Self); ///使用动画之后,必须Refresh,否则控件看不到!
SetActiveWindow(Handle); ///激活窗口
end;
 
 
 
后退
顶部