[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 实时消息的一个问题。
干得好,西蒙 - 非常好的技巧 !
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值