这里所说的倒计时对话框不是自定义对话框,自定义对话框很简单;也不是MessageBoxTimeout定时对话框,定时对话框是时间一到自动关闭。所谓倒计时对话框是由系统弹出的MsgBox对话框,是要在对话框上面动态地显示倒计时间,比如:10,9,8,7,6,5,4,3,2,1秒,然后自动关闭。实现的方法是用多媒体计时器API函数timeSetEvent,当模式对话框一弹出,像Timer这样的计时器都将被挂起,所以不能用Timer来实现,但timeSetEvent却可以,该API函数内部实现多线程,当用鼠标按住模式对话框的标题栏拖动对话框窗口时,不会影响回调的执行,不会影响倒计时间运行,也就是不会挂起timeSetEvent使用的回调函数TimeSetProc。从这一点来看,timeSetEvent比高精度频率计数器QueryPerformanceCounter、QueryPerformanceFrequency优越,前者会自动刷新界面,但后者不会(这里有一个例子可以对比:http://blog.youkuaiyun.com/chenjl1031/archive/2008/01/09/2032579.aspx)。
程序首先在TimeSetProc回调中枚举所有顶级窗口和子窗口,找到模式对话框的句柄和对话框提示文本的句柄,然后发送消息WM_SETTEXT动态地更新时间,时间一到发送消息WM_CLOSE关闭该模式对话框,并关闭多媒体计时器对象;如果响应了鼠标按钮,则直接关闭多媒体计时器对象。
非常遗憾的是,该程序只能编译成P代码才能正常运行。原因是TimeSetProc回调中调用了枚举顶级窗口和子窗口的回调,把这几行删除则可以编译成本地代码运行,但就不能实现该程序的功能了。
标准模块:
测试窗体代码: