让你的窗口增加动画效果
2007-03-21 13:43
239 查看
Windows图形界面实现了卷帘、淡入淡出和弹出效果,使界面更吸引人。如果你要在你的窗体中使用这些效果,你只需要一个API函数:AnimateWindow!
这个API函数使用简单,你只需要提供你的窗体的句柄、动画进行的毫秒数和一些指定效果和方向的标志。
试着在你的窗体的OnShow事件处理函数中加入下面的代码:
...
AnimateWindow(Self.Handle, 250, AW_BLEND or AW_ACTIVATE);
...
执行工程并看一下结果。很酷,是不是?
这个函数默认使用卷帘效果,但是你可以用AW_SLIDE获得幻灯效果,用AW_CENTER获得垮塌或扩展效果,用AW_BLEND获得平滑的淡入淡出效果。
还有,你可以加上AW_ACTIVATE标志如果你的窗体正在出现,或是AW_HIDE如果你的窗体将要被隐藏,这一标志颠倒动画的方向。
当你使用卷帘和淡入淡出效果时,你可以指定效果在水平和垂直轴发生的方向,添加AW_HOR_POSITIVE和AW_HOR_NEGATIVE设置x轴,添加W_VER_POSITIVE或是AW_VER_NEGATIVE设置y轴。
当你用AW_CENTER标志时,所有这些标志都可以省略。
试验不同的标志组合并看一下结果!
--------------------------------------------------------------------------------
当你玩了一段时间后,你会发现一个奇怪的地方:一些控件显示正常,其他的控件绘图有错误,还有一些根本不画!!
原因很简单,但是解决方法很麻烦。
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函数。
这个API函数使用简单,你只需要提供你的窗体的句柄、动画进行的毫秒数和一些指定效果和方向的标志。
试着在你的窗体的OnShow事件处理函数中加入下面的代码:
...
AnimateWindow(Self.Handle, 250, AW_BLEND or AW_ACTIVATE);
...
执行工程并看一下结果。很酷,是不是?
这个函数默认使用卷帘效果,但是你可以用AW_SLIDE获得幻灯效果,用AW_CENTER获得垮塌或扩展效果,用AW_BLEND获得平滑的淡入淡出效果。
还有,你可以加上AW_ACTIVATE标志如果你的窗体正在出现,或是AW_HIDE如果你的窗体将要被隐藏,这一标志颠倒动画的方向。
当你使用卷帘和淡入淡出效果时,你可以指定效果在水平和垂直轴发生的方向,添加AW_HOR_POSITIVE和AW_HOR_NEGATIVE设置x轴,添加W_VER_POSITIVE或是AW_VER_NEGATIVE设置y轴。
当你用AW_CENTER标志时,所有这些标志都可以省略。
试验不同的标志组合并看一下结果!
--------------------------------------------------------------------------------
当你玩了一段时间后,你会发现一个奇怪的地方:一些控件显示正常,其他的控件绘图有错误,还有一些根本不画!!
原因很简单,但是解决方法很麻烦。
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函数。
相关文章推荐
- JavaScript_窗口移动动画效果示例;
- 为iOS App增加启动动画效果
- Windows界面编程第六篇 动画启动效果(动画效果显示及隐藏窗口)
- andorid popupwindow 更新时动画的实现,可实现一个窗口被一个窗口推上去的效果
- Android Dialog(对话框)增加动画效果
- 用AnimateWindow函数实现窗口动画效果
- 效果不错的窗口打开与关闭的动画效…
- 优化 Linux/Gnome桌面环境的 窗口动画效果
- javascript转换静态图片,增加粒子动画效果
- Android 动画,从顶部进入,底部往上退出,类似于卷窗口的效果
- UIDynamicItemBehavior-动画效果:增加各种物理特性
- VB.NET 章鱼哥出品--利用API函数AnimateWindow创建Popup提示窗口,窗体的动画效果
- delphi 实现窗口动画效果 Animatewindow 的应用
- 窗口 dialog 弹出时动画效果
- MFC---AnimateWindow实现窗口动画效果
- 动画效果打开新窗口
- WinForm 窗口缩放动画效果
- Android仿QQ窗口的抖动的动画效果
- AnimateWindow函数实现窗口动画效果
- 用AnimateWindow函数实现窗口动画效果