• delphi 任务栏按钮闪烁(转)


    如果您创建的应用程序是运行在Windows 98或更高版本操作系统上,您可以通过调用API函数FlashWindowEx并赋给它一个FlashWInfo结构体来实现.  而如果是运行在Windows 95上则比较麻烦,但您也可以通过使用一个Timer组件来实现想要的效果。
    FlashWindowEx
    当您调用API函数FlashWindowEx时,一个TFlashWInfo被用来控制Windows实现该闪烁功能的信息.  幸运的是,Delphi已经为您封装了该结构体。Delphi中它被申明如下:
    type  TFlashWInfo = record    cbSize : LongInt;    hWnd : LongInt;    dwFlags : LongInt;    uCount : LongInt;    dwTimeout : LongInt;  end;
    您所需做的全部事情仅仅是填充和组装该记录类型,并调用API函数。本例中,我把两者放在了一个按钮的OnClick事件中,当然您也可以放置它们到任何合适的地方:
    procedure TForm1.Button1Click(Sender: TObject);
    var  FWinfo: TFlashWInfo;
    begin 
    FWinfo.cbSize := 20; 
    FWinfo.hwnd := Application.Handle; // 闪烁窗口的句柄 
    FWinfo.dwflags := FLASHW_ALL; 
    FWinfo.ucount := 10; // 闪烁的次数 
    FWinfo.dwtimeout := 0; // 速度以毫秒为单位, 0 默认为与指针闪烁的速率相同
     FlashWindowEx(FWinfo); // 使它闪烁!
    end;
    dwflags指示了闪烁的方式,下面是dwflags属性的取值定义:
    FLASHW_STOP = 0      // 停止闪烁FLASHW_CAPTION = 1   // 闪烁窗口标题FLASHW_TRAY = 2      // 闪烁任务栏按钮FLASHW_ALL = 3       // 闪烁窗口标题与任务栏按钮
    FLASHW_TIMER = 4     // 不停地闪烁,直到FLASHW_STOP标志设置FLASHW_TIMERNOFG = 5 // 不停地闪烁直到窗口被前置
    以上只有在Windows 98或更高版本操作系统上才有效,如果您要在Windows 95上实现,您就需要采取另一不同的途径:
    FlashWindow
    Windows 95下 (并且Delphi 3及更底版本并包含适用的API封装) 需要不同的途径.  该操作系统下没有FlashWindowEx这个API函数,您需要使用FlashWindow来代替.  (FlashWindow还能在更低版本的操作系统中被调用。)
    但问题是FlashWindow只能闪烁一次,所以要达到闪烁按钮的目的就需要用到一个timer组件。 当然,这样一来也就加大了宝贵的系统资源开销 - 但它能完成我们想要的效果。
    为了达到本示例的目的,您需要创建一个form,并放上一个Timer组件和一个按钮组件。 之后选中Timer组件并双击,OnTimer事件将被创建.  接着添加以下代码:
    procedure TForm1.Timer1Timer(Sender: TObject);begin  FlashWindow(Application.Handle, True);end;
    下一步,你需要启动闪烁。这一步很简单,在Button的OnClick事件中设置Timer的Enabled属性为Ture。本例中我使用Button的事件来切换闪烁的开与关:
    procedure TForm1.Button1Click(Sender: TObject);begin  Timer1.Enabled := not Timer1.Enabled;end;
    到此为止,两种不同方法实现了相同的功能。
    ?Chris Bray /Vertical Software 2002
    示例贴出还没几分钟,西蒙·克莱顿(Simon Clayton)就提出了一个闪烁方法的建议——仅当应用程序不是当前活动的一个时。 西蒙改写如下:
    我是这样做的:
    procedure TForm1.Timer1Timer(Sender: TObject);
    begin  
    if (GetForeGroundWindow()<>Form1.Handle) then    
    begin      
    FWinfo.cbSize := 20;      
    FWinfo.hwnd := Application.Handle;     
     FWinfo.dwflags := FLASHW_ALL;      
    FWinfo.ucount := 5;      
    FWinfo.dwtimeout := 0;      
    Flashing := True;      
    FlashWindowEx(FWinfo);    
    end  
    else
    if (Flashing) then   
     begin      
    FWinfo.cbSize := 20;     
     FWinfo.hwnd := Application.Handle;      
    FWinfo.dwflags := FLASHW_STOP;      
    FWinfo.ucount := 0;      
    FWinfo.dwtimeout := 0;      
    FlashWindowEx(FWinfo);     
     Flashing := false;   
     end;
    end;
    我也在Form的onPaint事件中加入了一些停止闪烁的代码:
    procedure TForm1.FormPaint(Sender: TObject);begin  if (Flashing) then    begin      FWinfo.cbSize := 20;      FWinfo.hwnd := Application.Handle;      FWinfo.dwflags := FLASHW_STOP;      FWinfo.ucount := 0;      FWinfo.dwtimeout := 0;      FlashWindowEx(FWinfo);    end;end;
    我现在要解决的唯一一个问题是,如果我正我第二台显示器使用一个应用程序,而窗体却在我第一个显示器的顶层,那么当我切换回应用程序时,onPaint事件好像没能被调用 。也就是说闪烁一直在进行 - 我注意到这应该是MS实时消息的一个问题。
    干得好,西蒙 - 非常好的技巧!
  • 相关阅读:
    别让猴子翻到背上
    python生成二维码
    50条经典爱情观
    智力测试题
    SQL数据库优化
    递归函数实现二分查找法
    软件开发类别
    递归函数的深度问题
    UVALive
    UVALive
  • 原文地址:https://www.cnblogs.com/guorongtao/p/4540757.html
Copyright © 2020-2023  润新知