说说模态化8:一个更好版本的超时关闭对话框

说说模态化8:一个更好版本的超时关闭对话框

作者:BlogUpdater |  时间:2022-06-14 |  浏览:126 |  评论已关闭 条评论

在上一篇文章中,我们实现了一个基础版本的超时关闭对话框,但是我们提到那个版本有个限制,就是:它同一时刻,只能在同一个线程中使用。今天,我们来修改下代码,实现一个更好的版本,来去掉这个限制。

如果你还记得的话,上面说的限制的原因在于:我们将”对话框是否超时”这个标志变量保存为了一个全局变量。为了修复这个问题,我们将它保存到实例级别的位置,也就是所谓的一个”帮助窗口”。

还是从我们的例子程序开始,我们添加窗口类的代码,更改窗口类的名称,使其不与例子程序的类名冲突(感谢读者Adrian指出这一点),然后添加以下代码:

上面的代码和之前的基础版本的代码,基本差不了多少,只是在变量保存方面有一点细微的差别。

对话框的超时状态被保存到了TOOLATEINFO结构体中,但是我们如何将它传递到定时器回调函数中去呢?你无法传递任何参数到定时器回调中。

但是,定时器回调可以访问一个窗口句柄。但正如我们几天前发现的那样,我们不能仅仅将回调挂起在 hwndOwner 窗口之外,因为我们不知道如何选择与现有 ID 不冲突的计时器 ID。

解决办法:把它挂在我们自己创建的窗口上。 这样,我们获得了一个全新的计时器 ID 空间,与属于 hwndOwner 的计时器 ID 分开。 例子窗口是一个方便使用的窗口。 我们没有将窗口过程传递给 CreateScratchWindow,因为没有必要; 我们想要的只是一个拥有我们计时器的窗口,仅此而已。

总结
老祖宗教导了我们很多次:尽量(绝对)不要使用全局变量,快速撸码的时候,你是爽了,但是爽过之后,当你的项目越来越大,组件关系越来越复杂的时候,无尽的悔恨和懊悔就会时不时袭来,但是此时,你已积重难返。
“我当初为什么没有在设计上多花点功夫!”

最后
Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一,里面有很多关于Windows的小知识,对于广大Windows平台开发者来说,确实十分有帮助。
本文来自:《Modality, part 8: A timed MessageBox, the better version》

最近我写了个东西
正如你们所知道的,拓扑梅尔智慧办公平台(Topomel Box)是一款绿色软件,主要面向经常使用电脑的朋友。它提供了各种提升办公效率的小功能,同时操作上尽可能地简单方便。
我想:你值得拥有。

评论已关闭。