//执行AnimateWindow之后窗体没有重绘
//应该算Delphi、或者是Windows的Bug吧!天知道~~
procedure TForm1.FormShow(Sender: TObject);
begin
  AnimateWindow(Handle, 800, AW_CENTER);
  Repaint; //加一句试试
end;

解决方案 »

  1.   

    procedure TForm1.FormShow(Sender: TObject);
    begin
      AnimateWindow(Handle, 800, AW_ACTIVATE or AW_CENTER); //别忘AW_ACTIVATE,我说调试怎么这样别扭
      Repaint; //加一句试试
    end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      AnimateWindow(Handle, 800, AW_HIDE or AW_CENTER);
    end;
      

  2.   

    AnimateWindow (Handle, 800, AW_center);
      self.Refresh();  // 加上这句
    原因是 TImage 不是TWinControl类,没有消息循环,得不到系统发给他重画的消息,而这类的东西是由VCL来负责画的。
      

  3.   

    这个是AnimateWindow 自己的问题 不止image组件 还有其他的很多组件都无法显示出来 我以前有试过 好象在OnActive事件中写AnimateWindow语句会好一些
      

  4.   

    斑竹和楼上的,我也发现了这个问题,比如TGroupBox就不能正确刷新,我也不知道为什么,放在 OnActive里面就没有了效果了。
    两位研究一下。
      

  5.   

    伴水老大的方法也不行的。//以下是摘自<<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函数。
      

  6.   

    to 耙子:
    可TStringGrid、TDBGrid等从TWinControl继承下来的控件也有这样的问题 :(
    原因关注中... ...
      

  7.   

    怪 在DELPHI7下好象不存在你说的这个问题 如果放在OnActive事件中竟然没有一点效果 难道是我以前的程序有问题??应该有调试过的
      

  8.   

    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;
      

  9.   

    以上的部分是从书抄的,以下的就是我一个杜撰了,忘各位高人多多指教。
    你要显示哪个控件(TWinControl)只要在 AnimateWindow(Handle, 800, AW_CENTER) 后加上  XXX.Repaint( XXX可以为你的Image1) 就可以了
      

  10.   

    To:伴水。 我曾经从Image中继承过一个TImageEx就是加上一个消息就可以了,书上说的是对的。
      

  11.   

    伴水的招数的确狠,东西时都出来,可是都是在动画晚了之后蹦出来的。
    AnminateWindow 这个是win2k出来才正式宣布出来的。可能borland当时没考虑到。新版的delphi 7估计重新写了这些控件的消息处理。
      

  12.   

    to blazingfire: 看来你所说的就是原因,但如果要把全部的控件都来重写一遍就麻烦了! :)
    to pazee: 是呀,编程不可能什么都考虑进去。实现功能先好久没有进行这样愉快的技术交流了,感谢大家 :)
      

  13.   

    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;
      

  14.   

    本来Zswang给出了答案,但是看见大家这么高兴,我也就Post出来我以前的写的程序里面的一部分代码把,实际上,TFrmBase是我的一个基窗体,提供了N多功能的,你从TFrmBase继承一个Modal窗体的话,有很多意想不到的好处哦。上面的窗口打开和关闭只不过是其中一项而已。 :-)
      

  15.   

    对于低版本的delphi,我觉得应该在背景放一个容器,让他覆盖Form,所有空间都放它上面,,比如TPanel,然后重载他的WinProc函数,捕获Paint消息,在函数里面写上伴水的遍历控件的代码。
      

  16.   

    to: Kingron(单身走我路……这东西挺有意思,不过我想borland为了兼容,可能完善TFrom也困难了