不知该如何实现窗体退出时的渐隐效果,能否直接设置该控件的属性就可以实现?还是需要编程来控制?倒是淡入非常容易实现,还望各位高人不吝教!

解决方案 »

  1.   

    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函数。
      

  2.   

     okiknow:你介绍的方法很实用,一般情况下使用AnimateWindow()函数来实现窗体的淡出时非常便捷,但当在窗体上使用了一幅背景图的情况下,该函数不能够实现图与窗体的同步淡出,其视效果不好,是不是也正好印证了你在后半部分所描述的问题?个人觉得还是skinEngine的效果比较理想,尽管有不少介绍说该控件太占资源。
      

  3.   

    在SeSkinForm中有个属性showanimation中选择kaFade,就可以使窗体淡进淡出!
      

  4.   

    To okiknow:请教:我怎么没有找到这个属性?我用的是版本是3.4.6,有不同吗?
      

  5.   

    最恼人的是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中该做如何处理,还请高手们多指教。
      

  6.   

    请教skinengine 如何安装呀,我找不到.bpl 文件