如何使用skinEngine实现窗体的淡出效果呢? 不知该如何实现窗体退出时的渐隐效果,能否直接设置该控件的属性就可以实现?还是需要编程来控制?倒是淡入非常容易实现,还望各位高人不吝教! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 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函数。 okiknow:你介绍的方法很实用,一般情况下使用AnimateWindow()函数来实现窗体的淡出时非常便捷,但当在窗体上使用了一幅背景图的情况下,该函数不能够实现图与窗体的同步淡出,其视效果不好,是不是也正好印证了你在后半部分所描述的问题?个人觉得还是skinEngine的效果比较理想,尽管有不少介绍说该控件太占资源。 在SeSkinForm中有个属性showanimation中选择kaFade,就可以使窗体淡进淡出! To okiknow:请教:我怎么没有找到这个属性?我用的是版本是3.4.6,有不同吗? 最恼人的是NT居然不支持AnimateWindow()函数!在网上看到过一篇文章介绍在VC环境中如何解决这个问题,现摘录如下:---------------------------------------------------------------------------------.... ....四、编译时出现的问题 在实现动画窗口的程序时,笔者发现如果直接在VC中使用AnimateWindow函数,在编译时会报告出错。以上述程序为例,在编译时系统会报告: 'AnimateWindow' : undeclared identifier 'AW_HIDE' : undeclared identifier 'AW_CENTER' : undeclared identifier 通过错误提示可以看出是编译系统认为AnimateWindow函数和AW_HIDE、AW_CENTER两个参数没有定义。因该函数是定义在Winuser.h头文件中的,于时,笔者显示地在程序中定义了对该头文件的包含,编译时却仍然出现相同的错误。为什么在VC中编译不能通过呢?通过查阅MSDN笔者发现在MSDN中明确提到WindowsNT5.0和Windows98以上版本均支持该函数。通过笔者的研究发现,问题出在定义AnimateWindow函数的头文件Winuser.h中,在VC安装目录下进入include子目录,用EDIT打开Winuser.h文件,按F3键查找AnimateWindow,可以发现有两处定义,一处是定义该函数中使用到的参数;另一处是该函数原型的定义。在这两处定义中均出现了对Windows版本的条件判断,#if (WINVER >= 0X500)……,原来问题出在这里,我们目前所使用的各种Windows主版本号均为5点零以下,所以在VC中编译上述程序时,编译系统自然将AnimateWindow函数排除在外。因此为了在我们的程序中使用该函数,就得对其头文件进行一些小小的修改,即将#if (WINVER >= 0X500)改为#if (WINVER >= 0X400),请注意两处出现该函数定义的部分都要进行修改,改完后保存重新启动。修改好头文件后,编译即可通过。 ---------------------------------------------------------------------------------其后又见到有网友对该方法的一点补充:你的方法太笨了,我有一法,在STDAFX.H文件中加上如下的句子:#undef WINVER#define WINVER 0X500一切OK!!!---------------------------------------------------------------------------------不知道在Delphi5中该做如何处理,还请高手们多指教。 请教skinengine 如何安装呀,我找不到.bpl 文件 如何获得指定进程的句柄? 关于Ttreeview问题,高手请 问个软件开发合作的问题 小女急需学校机房管理系统的毕业论文及源码 急盼的救命啊~~~ 100分啊 在线急等 Qreport的菜鸟问题,为什么我预览的时候只有一条记录 请问谁安装过FlatStyle?再装了FlatDbCtrl? 怎样才能从TDateTime 中取出月份 我发现本论坛上有人转播病毒!!! 怎么在windows 98 里,实现窗体的渐进渐出! 关掉广告窗口的实现原理是什么? 关于字母字符和数字字符组合的排序,怎样写才好呢? 请问用adotable怎样动态建表!!!
这个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函数。
.... ....四、编译时出现的问题 在实现动画窗口的程序时,笔者发现如果直接在VC中使用AnimateWindow函数,在编译时会报告出错。以上述程序为例,在编译时系统会报告: 'AnimateWindow' : undeclared identifier 'AW_HIDE' : undeclared identifier 'AW_CENTER' : undeclared identifier 通过错误提示可以看出是编译系统认为AnimateWindow函数和AW_HIDE、AW_CENTER两个参数没有定义。因该函数是定义在Winuser.h头文件中的,于时,笔者显示地在程序中定义了对该头文件的包含,编译时却仍然出现相同的错误。为什么在VC中编译不能通过呢?通过查阅MSDN笔者发现在MSDN中明确提到WindowsNT5.0和Windows98以上版本均支持该函数。通过笔者的研究发现,问题出在定义AnimateWindow函数的头文件Winuser.h中,在VC安装目录下进入include子目录,用EDIT打开Winuser.h文件,按F3键查找AnimateWindow,可以发现有两处定义,一处是定义该函数中使用到的参数;另一处是该函数原型的定义。在这两处定义中均出现了对Windows版本的条件判断,#if (WINVER >= 0X500)……,原来问题出在这里,我们目前所使用的各种Windows主版本号均为5点零以下,所以在VC中编译上述程序时,编译系统自然将AnimateWindow函数排除在外。因此为了在我们的程序中使用该函数,就得对其头文件进行一些小小的修改,即将#if (WINVER >= 0X500)改为#if (WINVER >= 0X400),请注意两处出现该函数定义的部分都要进行修改,改完后保存重新启动。修改好头文件后,编译即可通过。 ---------------------------------------------------------------------------------其后又见到有网友对该方法的一点补充:你的方法太笨了,我有一法,在STDAFX.H文件中加上如下的句子:
#undef WINVER
#define WINVER 0X500
一切OK!!!
---------------------------------------------------------------------------------不知道在Delphi5中该做如何处理,还请高手们多指教。