delphi实现窗体闪烁功能
以前做窗口闪动时都没有考虑到让任务栏上的按钮闪动的问题,
现在一个客户需要任务栏按钮闪动,发现以前使用的flashwindow不能达到要求了,
查找了一下,找到flashwindowex这个API
如果您创建的应用程序是运行在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;
到此为止,两种不同方法实现了相同的功能。